在R中读取固定宽度格式文件
我正在尝试使用read.fwf将此固定宽度文件读入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
> 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")