如何在不使用data.table的情况下展平列表中的两个列表?

时间:2013-08-28 12:29:32

标签: r data.table

我想从列表中的列表中构建一个data.frame

L1 <- list(A = c(1, 2, 3), B = c(5, 6, 7))
L2 <- list(A = c(11, 22, 33), B = c(15, 16, 17))
L3 <- list(L1, L2)
L3

library(data.table)

根据'data.table'手册:“'rbindlist'与do.call(”rbind“,l)相同,但更快”

我想使用R base package

实现'rbindlist'的功能

rbindlist正是我需要的,但'do.call'却没有!

rbindlist(L3)

do.call没有做我想要的事情

do.call(rbind, L3)

identical(rbindlist(L3), do.call(rbind, L3))

2 个答案:

答案 0 :(得分:5)

我认为每次调用as.data.frame可能代价高昂。怎么样?

as.data.frame(do.call(mapply, c(L3, FUN=c, SIMPLIFY=FALSE)))

mapply基本上采用L3的第一个元素并应用函数FUN,然后应用第二个元素,依此类推......假设您有两个列表(L3[[1]]和{{1然后你会这样做:

L3[[2]]

此处mapply(FUN=c, L3[[1]], L3[[2]], SIMPLIFY=FALSE) 确保输出不会转换(或简化)为矩阵。因此它将是一个列表。对于一般情况,我们使用SIMPLIFY=FALSE并将我们的列表与函数do.call的所有其他参数一起传递。希望这会有所帮助。


对大数据进行基准测试:

mapply

答案 1 :(得分:3)

您需要先将L3中的子列表转换为data.frame

> do.call(rbind, lapply(L3, as.data.frame))
   A  B
1  1  5
2  2  6
3  3  7
4 11 15
5 22 16
6 33 17