r - 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
解决方案
没有分隔符。所以解决这个问题的方法是使用 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
您使用宽度读取所有数据。
推荐阅读
- amazon-web-services - 错误管道步骤“无服务器部署”显示“IamRoleLambdaExecution - 角色 XXXXX 的最大策略大小超过 10240 字节”
- bash - 如果第一列中的值匹配并且第二列中的值与bash中另一个文件中的值不匹配,则提取行
- oracle - 我无法删除 sqlplus 中的所有表
- c# - 匹配字符串中的两个正则表达式
- wordpress - 向 Wordpress 添加大型复杂自定义页面?
- r - 如何在用“vcd”制作的关联图中格式化 p 值?
- qt - 在 Qt 中编写自定义按钮的好方法是什么?
- windows - 等待由 IContextMenu.InvokeCommand 启动的进程
- apache-camel - 如何使用骆驼邮件将带有内联附件的电子邮件发送到 Outlook
- c# - 如何获得调整后图像的大小?