下面的代码生成数据文件,其中每行的列数不同.选项fill=TRUE似乎只有在达到某个字符限制时才起作用.例如,将第1-3行与第9-11行进行比较,注意这两个示例都按预期工作.如何在启用fill=TRUE行的情况下阅读整个notworking1.dat,而不仅仅是前fill=TRUE行?

for (i in seq(1000,1099,by=1)) 
    cat(file="working1.dat", c(1:i, "\n"), append = TRUE)
df <- fread(input = "working1.dat", fill=TRUE)

for (i in seq(1000,1101,by=1)) 
    cat(file="notworking1.dat", c(1:i, "\n"), append = TRUE)
df <- fread(input = "notworking1.dat", fill=TRUE)

for (i in seq(1,101,by=1)) 
    cat(file="working2.dat", c(1:i, "\n"), append = TRUE)
df <- fread(input = "working2.dat", fill=TRUE)

以下solution项也将失败

df <- fread(input = "notworking1.dat", fill=TRUE, col.names=paste0("V", seq_len(1101)))

收到警告信息:

Warning message: In data.table::fread(input = "notworking1.dat", fill = TRUE) : Stopped early on line 101. Expected 1099 fields but found 1100. Consider fill=TRUE and comment.char=. First discarded non-empty line: <<1 2 3 4 ...

推荐答案

我们可以找出最大列数,再加上那么多列,然后是fread:

x <- readLines("notworking1.dat")
myHeader <- paste(paste0("V", seq(max(lengths(strsplit(x, " ", fixed = TRUE))))), collapse = " ")

# write with headers
write(myHeader, "tmp_file.txt")
write(x, "tmp_file.txt", append = TRUE)
# read as usual with fill
d1 <- fread("tmp_file.txt", fill = TRUE)

# check output
dim(d1)
# [1]  102 1101
d1[100:102, 1101]
#    V1101
# 1:    NA
# 2:    NA
# 3:  1101

但由于我们已经用readLines导入了数据,我们可以对其进行解析:

x <- readLines("notworking1.dat")
xSplit <- strsplit(x, " ", fixed = TRUE)

# rowbind unequal length list, and convert to data.table
d2 <- data.table(t(sapply(xSplit, '[', seq(max(lengths(xSplit))))))

# check output
dim(d2)
# [1]  102 1101
d2[100:102, 1101]
#    V1101
# 1:  <NA>
# 2:  <NA>
# 3:  1101

这是一个已知的问题GitHub issue 5119,尚未实现,但建议fill也将整数作为输入.因此,解决方案是:

d <- fread(input = "notworking1.dat", fill = 1101)

R相关问答推荐

在R底座中更改白天和夜晚的背景 colored颜色

如何删除R中除某些特定名称外的所有字符串?

将年度数据插入月度数据

在数学中正确显示摄氏度、开氏度或华氏度

在R中为马赛克图中的每个字段着色

删除具有相同标题的tabPanel(shinly)

如何使用STAT_SUMMARY向ggplot2中的密度图添加垂直线

在df中保留原始变量和新变量

使用较长的查询提取具有部分匹配的列表中的较短目标,

在不丢失空值的情况下取消列出嵌套列表

将重复项转换为NA

如何指定我的函数应该查找哪个引用表?

将工作目录子文件夹中的文件批量重命名为顺序

使用ggplot2中的sec_axis()调整次轴

带RStatix的Wilcoxon环内检验

有毒元素与表观遗传年龄的回归模型

长/纬点继续在堪萨斯-SF结束,整齐的人口普查

R-使用stri_trans_General()将其音译为德语字母

从单个html段落中提取键-值对

当R使用c()组合两个向量时会发生什么?