【问题标题】:How can I flatten two lists within a list without using data.table?如何在不使用 data.table 的情况下展平列表中的两个列表?
【发布时间】:2013-08-31 12:41:42
【问题描述】:

我想从列表中的列表形成一个 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 基础包实现 'rbindlist' 的功能

rbindlist 完全符合我的需要,但 'do.call' 没有!

rbindlist(L3)

do.call 没有做我想做的事

do.call(rbind, L3)

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

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我认为每次拨打as.data.frame 的成本都很高。怎么样?

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

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

    mapply(FUN=c, L3[[1]], L3[[2]], SIMPLIFY=FALSE)
    

    此处SIMPLIFY=FALSE 确保输出未转换(或简化)为矩阵。因此它将是一个列表。对于一般情况,我们使用do.call 并将我们的列表与函数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
    

    【讨论】:

    • +1。当然,如果我们追求速度并且我们所有列表项的暗淡相同,并且我们已经知道它们是什么:A &lt;- unlist(ll, use.names=FALSE); dim(A) &lt;- c(3, 2, 2000); apply(A, 2, I)。虽然有很多“如果”:)
    • 谢谢 Arun,您的解决方案非常完美。但是,我不明白 args = c(applyMeanList, FUN=c, SIMPLIFY=FALSE)) to do.call。你能提供进一步的解释吗?
    【解决方案2】:

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

    > 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
    

    【讨论】:

      猜你喜欢
      • 2023-01-01
      • 2011-12-29
      • 2011-07-14
      • 2018-06-21
      • 1970-01-01
      • 2015-05-28
      • 2022-11-17
      • 2020-05-02
      相关资源
      最近更新 更多