我认为as.data.frame
每次打电话可能会很昂贵。怎么样?
as.data.frame(do.call(mapply, c(L3, FUN=c, SIMPLIFY=FALSE)))
mapply
基本上采用 L3 的第一个元素并应用 function FUN
,然后是第二个元素等等......假设你有两个列表(L3[[1]]
和L3[[2]]
),那么你会这样做:
mapply(FUN=c, L3[[1]], L3[[2]], SIMPLIFY=FALSE)
此处SIMPLIFY=FALSE
确保输出未转换(或简化)为矩阵。因此它将是一个列表。对于一般情况,我们使用do.call
并将列表与所有其他参数一起传递给 function mapply
。希望这可以帮助。
大数据基准测试:
ll <- unlist(replicate(1e3, L3, simplify=FALSE), rec=FALSE)
aa <- function() as.data.frame(do.call(mapply, c(ll, FUN=c, SIMPLIFY=FALSE)))
bb <- function() do.call(rbind, lapply(ll, as.data.frame))
require(microbenchmark)
microbenchmark(o1 <- aa(), o2 <- bb(), times=10)
Unit: milliseconds
expr min lq median uq max neval
o1 <- aa() 4.356838 4.931118 5.462995 7.623445 20.5797 10
o2 <- bb() 673.773795 683.754535 701.557972 710.535860 724.2267 10
identical(o1, o2) # [1] TRUE