在R上加载空格分隔数据?

时间:2014-04-15 17:20:12

标签: r

我想将ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/daily/ghcnd-stations.txt读入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 个答案:

答案 0 :(得分: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 = ""重置此项,让您读取文件没有任何问题。

答案 1 :(得分:0)

Thomas的回答非常好,我只想补充一点,您可以使用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’

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