7

我有一个巨大的列表(700 个元素),每个元素都是长度 = 16,000 的向量。我正在寻找一种将列表转换为数据框的有效方法,采用以下方式(这只是一个模拟示例):

lst <- list(a = c(1,2,3), b = c(4,5,6), c = c(7,8,9))

我正在寻找的最终结果是:

 #  [,1] [,2] [,3]
 #a    1    2    3
 #b    4    5    6
 #c    7    8    9

这是我尝试过的,但没有按我的意愿工作:

library(data.table)
result = rbindlist(Map(as.data.frame, lst))

有什么建议吗?请记住,我的真实示例具有很大的尺寸,我需要一种相当有效的方法来执行此操作。

非常感谢!

4

3 回答 3

18

尝试这个。我们假设L所有组件的长度相同n,并且我们还假设没有行名:

L <- list(a = 1:4, b = 4:1) # test input

n <- length(L[[1]])
DF <- structure(L, row.names = c(NA, -n), class = "data.frame")
于 2013-09-11T17:54:33.240 回答
6

我认为

lst <- list(a = c(1,2,3), b = c(4,5,6), c = c(7,8,9))
do.call(rbind,lst)

作品。我不知道是否有一种更有效的偷偷摸摸/危险/偷工减料的方法。

你也可以试试

m <- matrix(unlist(lst),byrow=TRUE,ncol=length(lst[[1]]))
rownames(m) <- names(lst)
as.data.frame(m)

...也许它更快?

您可能无法在加快这as.data.frame一步方面做很多事情。看看as.data.frame.matrix可以剥离哪些内容以使其尽可能简单,似乎关键在于必须将列复制到它们自己的单独列表元素中:

for (i in ic) value[[i]] <- as.vector(x[, i])

您可以尝试剥离as.data.frame.matrix以查看是否可以加快速度,但我猜测此操作是瓶颈。为了绕过它,您必须找到一些更快的方法将数据从行列表映射到列列表(也许是Rcpp解决方案??)。

要考虑的另一件事是您是否真的需要一个数据框——如果您的数据是同质类型的,您可以将结果保存为矩阵。无论如何,大数据上的矩阵运算要快得多......

于 2013-09-11T17:42:05.583 回答
3

刚刚怎么样t(as.data.frame(List))

> A = 1:16000
> List = list()
> for(i in 1:700) List[[i]] = A
> system.time(t(as.data.frame(List)))
   user  system elapsed 
   0.25    0.00    0.25 
于 2013-09-11T18:01:42.847 回答