首页 > 解决方案 > R read.table:如何避免列不匹配导致的错误

问题描述

我在这里分享一个需要读入 R 的文本文件

https://www.filehosting.org/file/details/846022/PLT_PERIOD_ALL_175_P98.PLT

这是我到目前为止所做的

fname<-'PLT_PERIOD_ALL_175_P98.PLT'

rt0<-read.table(fname, skip=8, header = FALSE,
           stringsAsFactors = FALSE)
##Error in scan(file = file, what = what, sep = sep, quote = quote, dec = dec,  : 
##               line 84 did not have 10 elements

rt1<-read.table(fname, skip=8, header = FALSE, 
               stringsAsFactors = FALSE, fill=TRUE)
# this is messing up the last two columns by row 84

rt2<-read.table(fname, skip=8, header = FALSE, 
               flush = TRUE, stringsAsFactors = FALSE, fill=TRUE)
# this is skipping one column

rt3<-read.table(fname, skip=8, header = FALSE, sep='\t',
               flush = TRUE, stringsAsFactors = FALSE, fill=TRUE)
# this is reading all in one column

标签: rdataframeread.table

解决方案


没有分隔符。所以解决这个问题的方法是使用 fwf 文件逻辑。序言文本中似乎有 9 行,但其中一行被非标准换行符破坏。第 8 行具有定义列位置的下划线。第 84 行数据(以及后续行)在“NET ID”列中有条目,这些条目在上面的第 7-9 行中不存在。

*        X             Y      AVERAGE CONC    ZELEV    ZHILL    ZFLAG    AVE     GRP       RANK     NET ID   DATE(CONC)
* ____________  ____________  ____________   ______   ______   ______  ______  ________  ________  ________  ________
  739950.40000 5083641.40000      12.01732   124.31  1564.68     0.00    1-HR  ALL       175TH               19120324
  ---snipped lines------

这是您read.table( ..., fill=TRUE)在第 10 列中使用值为“CAR1”的添加数据进行操作后看到的内容:

83    739277.6 5083387  0.78225 123.46 1564.68  0 1-HR ALL 175TH 19010108
84    739061.1 5082586  0.34595 122.50 1564.70  0 1-HR ALL 175TH     CAR1
85  19052321.0      NA       NA     NA      NA NA                        
86    739161.1 5082586  0.39795 122.00 1564.70  0 1-HR ALL 175TH     CAR1

这是创建用于确定列位置的“标尺”的技巧。您可以使用以下输出计算出这些下划线列的宽度(包括开头的 2 个位置和 3 个位置间隙:

rt1<-readLines("~/Downloads/PLT_PERIOD_ALL_175_P98.PLT",n=9 )  # first 8 lines
rt2 <- paste0( rep(c(1:9,0),12), collapse="")     # one's place ruler
rt2[2] <- paste0( tail( rep( c(0:9, 0:1) ,each=10),-1 ),collapse="") # ten's place ruler

> rt2
[1] "123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
[2] "00000000011111111112222222222333333333344444444445555555555666666666677777777778888888888999999999900000000001111111111" 
> rt1[8]
[1] "* ____________  ____________  ____________   ______   ______   ______  ______  ________  ________  ________  ________"

然后阅读:

> ?read.fwf

您使用宽度读取所有数据。


推荐阅读