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

Posted

技术标签:

【中文标题】将具有未知列数的数据导入R?【英文标题】:Import data into R with an unknown number of columns? 【发布时间】:2010-12-24 20:54:27 【问题描述】:

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

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

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

data<-read.table("test",sep="\t",fill=TRUE)

不幸的是,为了评估最大行长度,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

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

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

但由于我有很多文件,我想在 R 中自动评估它。有什么建议吗? :-)


编辑:原始文件不包含渐进式数字,所以这不是解决方案:

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

【问题讨论】:

你能在文件中放一个标题吗(即文件的格式是否一致)? 很遗憾,文件是在外部生成的,每一行都可以有随机数量的条目。 【参考方案1】:

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

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

所以,使用您的第二种解决方案:

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

【讨论】:

【参考方案2】:

使用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")

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

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

【讨论】:

以上是关于将具有未知列数的数据导入R?的主要内容,如果未能解决你的问题,请参考以下文章

解析具有未知列数的 Pandas 数据框以在 statsmodels.api 中使用

如何将具有未知列数的 ResultSet 映射到 List 并将其显示在 HTML 表中?

Pandas:使用多张工作表导入 xlsx,将列添加到每个 df 及其所属工作表的名称,将具有相同列数的 df 连接起来

如何在 R 中读取具有不同列数的 CSV 文件

组合具有不同列数的 Spark 数据帧

T-SQL 查询将数据插入到具有可变列数的表中