我尝试使用read.fwf:
将此固定宽度文件读入R中http://www.cpc.ncep.noaa.gov/data/indices/wksst8110.for
当我执行此功能时,我得到一些奇怪的错误,除非我以非常具体的方式阅读,否则我无法理清:
> fwf <- read.fwf("getdata_wksst8110.for", 1:9, skip = 4)
> head(fwf)
V1 V2 V3 V4 V5 V6 V7 V8 V9
1 NA 3 JAN 1990 NA 23.4-0 0.4 25.1-0.3 26.6
2 NA 10 JAN 1990 NA 23.4-0 0.8 25.2-0.3 26.6
3 NA 17 JAN 1990 NA 24.2-0 0.3 25.3-0.3 26.5
4 NA 24 JAN 1990 NA 24.4-0 0.5 25.5-0.4 26.5
5 NA 31 JAN 1990 NA 25.1-0 0.2 25.8-0.2 26.7
6 NA 7 FEB 1990 NA 25.8 0 0.2 26.1-0.1 26.8
但是,您清楚地看到,通过将输出与原始文件进行比较,它是不对的。确实应该有9列,但它会切断我的日期列和其他列。
如果我使用sep =&#34; &#34;参数它只是抛出一个错误:
> fwf <- read.fwf("getdata_wksst8110.for", 1:9, skip = 4, sep = " ")
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
line 6 did not have 25 elements
请有人帮助我弄清楚为什么这不是以我期望的方式阅读?
这是我发现与使用此功能相关的有用链接,但它更多是与性能相关的问题。作者从未定义过他的widths = col参数。
感谢您考虑这个微不足道的问题。
所以我使用@MrFlick建议的宽度向量重新运行操作,数据看起来好多了。但是,我所看到的是&#34; sep&#34;争论显然是在肆虐。如果我使用sep =&#34; &#34;它抛出了一个奇怪的错误。但是,如果我不使用sep,那么它会使我的列结果突然显现。
*
Non-jerked results using widths = c(10, 4, 4, 4, 4, 4, 4, 4, 4)
> head(fwf)
V1 V2 V3 V4 V5 V6 V7 V8 V9
1 03JAN1990 NA 23 4-0. 4 25 .1-0 0.3 2
2 10JAN1990 NA 23 4-0. 8 25 .2-0 0.3 2
3 17JAN1990 NA 24 2-0. 3 25 .3-0 0.3 2
4 24JAN1990 NA 24 4-0. 5 25 .5-0 0.4 2
5 31JAN1990 NA 25 1-0. 2 25 .8-0 0.2 2
6 07FEB1990 NA 25 8 0. 2 26 .1-0 0.1 2
使用以下结果:
fwf&lt; - read.fwf(&#34; getdata_wksst8110.for&#34;,widths = c(10,4,4,4,4,4,4,4,4),skip = 4,sep =&#34;&#34;) 扫描错误(文件,内容,nmax,sep,dec,quote,skip,nlines,na.strings,: 第6行没有25个元素
我错过了sep的东西吗?
令人敬畏的@ MrFlick脚本的修改似乎符合法案(或多或少)!第一排仍然很麻烦,使我无法总结/总结高清[4]。删除第一行hd [-1,]似乎没有任何奇怪的帮助。哦,好吧。
hd<-read.fwf("http://www.cpc.ncep.noaa.gov/data/indices/wksst8110.for",
widths=c(10,rep(c(9,4),4)), skip=3)
trim <- function(x) gsub("^\\s+|\\s+$","",x)
main <- paste0(trim(hd[1,seq(2, ncol(hd), by=2)]), trim(hd[1,seq(3, ncol(hd), by=2)]))
sub <- trim(as.vector(hd[2,]))
names(hd) <- make.names(c(sub[1],paste(rep(main, each=2), sub[-1])))
答案 0 :(得分:2)
这是一个应该在数据中读取的命令
dd<-read.fwf("http://www.cpc.ncep.noaa.gov/data/indices/wksst8110.for",
widths=c(10, rep(c(9,4),4)), skip=4)
请注意,宽度需要考虑每行中的所有字符,因此即使列之间有空格,也需要将这些字符分配给其中一列。
然后我想不出一个超级干净的方式来获取标题。这有效,但它很难看并做出假设
hd<-read.fwf("http://www.cpc.ncep.noaa.gov/data/indices/wksst8110.for",
widths=c(10,rep(c(9,4),4)), skip=2, nrow=2, as.is=T)
trim <- function(x) gsub("^\\s+|\\s+$","",x)
main <- paste0(trim(hd[1,seq(2, ncol(hd), by=2)]), trim(hd[1,seq(3, ncol(hd), by=2)]))
sub <- trim(as.vector(hd[2,]))
names(dd) <- make.names(c(sub[1],paste(rep(main, each=2), sub[-1])))
最后,您可以使用
创建正确的日期值dd$Week <- as.Date(as.character(dd$Week), "%d%b%Y")
您根本不应该使用sep=
参数。 read.fwf
实际做的是使用sep作为分隔符将fixed文件重写为分隔文件,然后使用更标准的read.table()
读取分隔文件。默认值sep="\t"
通常是安全的,因为通常您的实际数据中没有标签。