在R中读取固定宽度格式文件

在R中读取固定宽度格式文件,r,read.table,R,Read.table,我正在尝试使用read.fwf将此固定宽度文件读入R: 当我执行此功能时,我会遇到一些奇怪的错误,除非我以非常具体的方式阅读,否则我无法解决这些错误: > 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

我正在尝试使用read.fwf将此固定宽度文件读入R:

当我执行此功能时,我会遇到一些奇怪的错误,除非我以非常具体的方式阅读,否则我无法解决这些错误:

> 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
使用以下方法快速生成结果:


fwf这里有一个应该读取数据的命令

dd<-read.fwf("http://www.cpc.ncep.noaa.gov/data/indices/wksst8110.for",
    widths=c(10, rep(c(9,4),4)), skip=4)

dd你认为
1:9
在做什么?该参数应指定每列的宽度(以字符数表示)。看起来您根本没有正确指定列宽。另外,您可能希望查看包中的
read\u fwf
函数,因为基本
read.fwf
函数效率很低(这应该是一个问题)。我也阅读了文档和read.table。列的宽度在所有列中都是可变的。例如,日期是9L,其他8列通常在3到4L之间变化-0.50=4、25.5=3、0.03=3等等,这就是为什么要提供宽度向量。因此,如果第一个字符是8个字符,第二个字符是4个字符,那么从
c(8,4,…)
开始。您可以为9列中的每一列指定宽度。我总是忘记您可以提供要使用的数据点向量。设置
widths=4
,意味着您只有一个宽度为4的列。如果有9列宽度为4,则可以执行
widths=c(4,4,4,4,4,4,4,4)
或者更简洁地说,
widths=rep(4,9)
。对于固定宽度的文件,您需要指定所有列的所有宽度;这是知道如何解析文件的唯一方法。
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
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])))
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")