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

May*_*you 6 performance r list dataframe

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

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

我要找的最终结果是:

 #  [,1] [,2] [,3]
 #a    1    2    3
 #b    4    5    6
 #c    7    8    9
Run Code Online (Sandbox Code Playgroud)

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

library(data.table)
result = rbindlist(Map(as.data.frame, lst))
Run Code Online (Sandbox Code Playgroud)

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

非常感谢你!

G. *_*eck 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")
Run Code Online (Sandbox Code Playgroud)

  • 如果list缺少名称,那么使用:`structure(L,row.names = c(NA,-n),. Name = seq_along(L),class ="data.frame")` (2认同)
  • 我认为,由于它直接由其组成部分构建,因此速度很快. (2认同)

Ben*_*ker 5

我认为

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

作品.我不知道是否有一种更加有效的偷偷摸摸/危险/切角方式.

你也可以试试

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

......也许它更快?

您可能无法在加快as.data.frame步骤方面做很多事情.看着as.data.frame.matrix,看看有什么可以被剥离,使其作为裸机越好,它似乎是症结也许在于列具有被复制到自己的个人列表中的元素:

for (i in ic) value[[i]] <- as.vector(x[, i])
Run Code Online (Sandbox Code Playgroud)

您可以尝试拆卸as.data.frame.matrix以查看是否可以加快速度,但我猜这个操作是瓶颈.为了避开它,你必须找到行的列表映射数据到列的列表(可能是一些更快捷的方式Rcpp解决?).

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