我有一个巨大的列表(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))
有什么建议吗?请记住,我的真实例子有很大的维度,我需要一种相当有效的方法来执行此操作。
非常感谢!
答案 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