将大型列表转换为数据帧的快速方法

时间:2013-09-11 17:38:55

标签: r performance list dataframe

我有一个巨大的列表(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))

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

非常感谢!

3 个答案:

答案 0 :(得分:16)

试试这个。我们假设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")

答案 1 :(得分:5)

我认为

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解决方案??)。

另一件需要考虑的事情是你是否真的需要数据框 - 如果你的数据属于同类型,你可以将结果保存为矩阵。无论如何,对大数据的矩阵运算要快得多......

答案 2 :(得分: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