将数据导入到具有未知列数的R中?

Fed*_*rgi 30 import r

我正在尝试读取具有不同行长度的文本文件:

1
1   2
1   2   3
1   2   3   4
1   2   3   4   5
1   2   3   4   5   6
1   2   3   4   5   6   7
1   2   3   4   5   6   7   8
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我在read.table中使用了参数fill = TRUE,所以:

data<-read.table("test",sep="\t",fill=TRUE)
Run Code Online (Sandbox Code Playgroud)

不幸的是,为了评估最大行长度,read.table只读取文件的前5行,并生成一个如下所示的对象:

data
   V1 V2 V3 V4 V5
1   1 NA NA NA NA
2   1  2 NA NA NA
3   1  2  3 NA NA
4   1  2  3  4 NA
5   1  2  3  4  5
6   1  2  3  4  5
7   6 NA NA NA NA
8   1  2  3  4  5
9   6  7 NA NA NA
10  1  2  3  4  5
11  6  7  8 NA NA
Run Code Online (Sandbox Code Playgroud)

有没有办法强制read.table滚动整个文件以评估最大行长度?我知道可能的解决方案是提供列号,例如:

data<-read.table("test",sep="\t",fill=TRUE,col.names=c(1:8))
Run Code Online (Sandbox Code Playgroud)

但由于我有很多文件,我想在R内自动评估这个.任何建议?:-)


编辑:原始文件不包含渐进数字,因此这不是一个解决方案:

data1<-read.table("test",sep="\t",fill=TRUE)
data2<-read.table("test",sep="\t",fill=TRUE,col.names=c(1:max(data1))
Run Code Online (Sandbox Code Playgroud)

Mar*_*rek 56

有一个很好的功能count.fields(见帮助),它计算每行的列数:

count.fields("test", sep = "\t")
#[1] 1 2 3 4 5 6 7 8
Run Code Online (Sandbox Code Playgroud)

所以,使用你的第二个解决方案

no_col <- max(count.fields("test", sep = "\t"))
data <- read.table("test",sep="\t",fill=TRUE,col.names=1:no_col)
data
#   X1 X2 X3 X4 X5 X6 X7 X8
# 1  1 NA NA NA NA NA NA NA
# 2  1  2 NA NA NA NA NA NA
# 3  1  2  3 NA NA NA NA NA
# 4  1  2  3  4 NA NA NA NA
# 5  1  2  3  4  5 NA NA NA
# 6  1  2  3  4  5  6 NA NA
# 7  1  2  3  4  5  6  7 NA
# 8  1  2  3  4  5  6  7  8
Run Code Online (Sandbox Code Playgroud)


Sha*_*ane 6

使用count.fields绝对是正确的方法,但只是为了完整性:

另一种选择是引入所有原始文本并在R中解析它:

x <- readLines(textConnection(
"1\t
1\t2
1\t2\t3
1\t2\t3\t4
1\t2\t3\t4\t5
1\t2\t3\t4\t5\t6"))
x <- strsplit(x,"\t")
Run Code Online (Sandbox Code Playgroud)

要组合不等长度向量的列表,最简单的方法是使用以下rbind.fill函数plyr:

library(plyr)
# requires data.frames with column names
x <- lapply(x,function(x) {x <- as.data.frame(t(x)); colnames(x)=1:length(x); return(x)})
do.call(rbind.fill,x)
1    2    3    4    5    6
1 1 <NA> <NA> <NA> <NA> <NA>
2 1    2 <NA> <NA> <NA> <NA>
3 1    2    3 <NA> <NA> <NA>
4 1    2    3    4 <NA> <NA>
5 1    2    3    4    5 <NA>
6 1    2    3    4    5    6
Run Code Online (Sandbox Code Playgroud)