我想将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
------------------------------
答案 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’
但您可以安全地忽略它,或者只是在文本文件的末尾添加换行符。