读取R

时间:2015-05-06 19:27:51

标签: r read.table

我尝试使用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])))

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"通常是安全的,因为通常您的实际数据中没有标签。