2014-04-15 23 views
1

我想將ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/daily/ghcnd-stations.txt讀入R數據幀。加載R上的空間分隔數據?

問題是該文件不是用逗號分隔的,某些列的某些觀察值爲空。

我試圖運行:

test <- read.table("ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/daily/ghcnd-stations.txt", header = FALSE) 

,但我得到了以下錯誤:

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : 

1號線沒有9元

的我怎麼能做到這一點任何想法?

謝謝!


這可能是有用的回答這個問題:

------------------------------ 
Variable Columns Type 
------------------------------ 
ID   1-11 Character 
LATITUDE  13-20 Real 
LONGITUDE 22-30 Real 
ELEVATION 32-37 Real 
STATE  39-40 Character 
NAME   42-71 Character 
GSNFLAG  73-75 Character 
HCNFLAG  77-79 Character 
WMOID  81-85 Character 
------------------------------ 
+2

請嘗試'read.fwf'。 – A5C1D2H2I1M1N2O1R2T1

+0

有沒有簡單的方法來確定我應該使用的寬度? – Ignacio

+1

計數:-)在這種情況下,我看不到一個簡單的方法。另外,許多電子表格程序(甚至是Excel)可以讓你在讀取數據時可視化地設置寬度,並且從那裏,你可以轉換爲CSV,複製和粘貼,或者使用許多其他技巧之一來獲取數據到R. – A5C1D2H2I1M1N2O1R2T1

回答

3

你有模式文件,因此從那裏,它不應該太多的工作。

閱讀在模式文件。

Schema <- read.table(text = "ID   1-11 Character 
LATITUDE  13-20 Real 
LONGITUDE 22-30 Real 
ELEVATION 32-37 Real 
STATE  39-40 Character 
NAME   42-71 Character 
GSNFLAG  73-75 Character 
HCNFLAG  77-79 Character 
WMOID  81-85 Character", header = FALSE, stringsAsFactors = FALSE) 

拆分第二列並提取範圍的上部。然後,使用diff找出widths

Widths <- as.numeric(sapply(strsplit(as.character(Schema$V2), "-"), `[`, 2)) 
Widths <- c(Widths[1], diff(Widths)) 
Widths 
# [1] 11 9 10 7 3 31 4 4 6 

現在,你可以使用read.fwf。模式文件也爲我們提供了列名。

out <- read.fwf("~/Downloads/ghcnd-stations.txt", widths = Widths, 
       col.names = Schema$V1, strip.white = TRUE, comment.char = "") 
head(out) 
#   ID LATITUDE LONGITUDE ELEVATION STATE     NAME GSNFLAG HCNFLAG WMOID 
# 1 ACW00011604 17.1167 -61.7833  10.1  ST JOHNS COOLIDGE FLD     NA 
# 2 ACW00011647 17.1333 -61.7833  19.2     ST JOHNS     NA 
# 3 AE000041196 25.3330 55.5170  34.0   SHARJAH INTER. AIRP  GSN   41196 
# 4 AF000040930 35.3170 69.0170 3366.0    NORTH-SALANG  GSN   40930 
# 5 AG000060390 36.7167 3.2500  24.0   ALGER-DAR EL BEIDA  GSN   60390 
# 6 AG000060590 30.5667 2.8667  397.0     EL-GOLEA  GSN   60590 

widths參數的關鍵是確定每個字段中的列數,並且使用負數,列的字段之間的數。

您的文件在某些​​行中包含「#」,將其視爲R中的註釋字符。設置comment.char = ""將重置此設置,讓我們在沒有任何問題的情況下讀取該文件。

+0

@AnandaMahto去吧。 – Thomas

+0

我保留了關於負數的說明,但如果您還要使用'strip.white = TRUE',通常不需要它們。 – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto非常好的編輯! – Thomas

0

托馬斯的回答是很不錯的,我只想補充一點,你可以用strip.white參數,以消除任何額外的空格[R發現字符數據值

mydata <- read.fwf(
+ file="mydataFWF.txt", 
+ width=c(11,-2,7,-3,7,-1,6,-1,2,-1,30,-1,3,-5,5), 
+ na.strings="", 
+ fill=TRUE, 
+ strip.white=TRUE) 

而且你經常會得到警告

In readLines(file, n = thisblock) : 
incomplete final line found on ’mydataFWF.txt’ 

但您可以安全地忽略它,或者只是在文本文件末尾添加換行符。