将具有未知列数的数据导入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 连接起来