【问题标题】:Rowbind List of lists in RRbind R 中的列表列表
【发布时间】:2021-08-21 21:14:51
【问题描述】:

我有一个列表列表,例如 out。在每个列表列表中,我都有一个数据框(具有相同的结构,即相同的变量)。

out <- replicate(4, rep(list(NULL), 2), simplify = FALSE)

我的愿望是将属于第一个列表列表的所有数据帧,第二个列表合并在一起(在我最初的练习中,我有超过 4 个列表的 2 个列表......对于这个例子,我会做类似以下的事情:

dataframe1 <- rbind(out[[1]][[1]], out[[2]][[1]], out[[3]][[1]], out[[4]][[1]])
dataframe2 <- rbind(out[[1]][[2]], out[[2]][[2]], out[[3]][[2]], out[[4]][[2]])

知道如何以迭代方式更优雅地完成它吗?

PS:抱歉没有分享真实数据。

【问题讨论】:

    标签: r list append row bind


    【解决方案1】:

    当您的框架都具有相似或相同的结构并且您打算对所有框架使用相同的“事物”时,通常最好使用list of frames 而不是单个元素。

    out <- replicate(4, rep(list(mtcars[c(1,3),1:3]), 2), simplify = FALSE)
    out[[1]][[1]]
    #             mpg cyl disp
    # Mazda RX4  21.0   6  160
    # Datsun 710 22.8   4  108
    
    lapply(1:2, function(ind) do.call(rbind, lapply(out, `[[`, ind)))
    # [[1]]
    #              mpg cyl disp
    # Mazda RX4   21.0   6  160
    # Datsun 710  22.8   4  108
    # Mazda RX41  21.0   6  160
    # Datsun 7101 22.8   4  108
    # Mazda RX42  21.0   6  160
    # Datsun 7102 22.8   4  108
    # Mazda RX43  21.0   6  160
    # Datsun 7103 22.8   4  108
    # [[2]]
    #              mpg cyl disp
    # Mazda RX4   21.0   6  160
    # Datsun 710  22.8   4  108
    # Mazda RX41  21.0   6  160
    # Datsun 7101 22.8   4  108
    # Mazda RX42  21.0   6  160
    # Datsun 7102 22.8   4  108
    # Mazda RX43  21.0   6  160
    # Datsun 7103 22.8   4  108
    

    如果您已经在使用dplyrdata.table,那么它们相对等效,但通常更安全一些:

    lapply(1:2, function(ind) data.table::rbindlist(lapply(out, `[[`, ind), fill = TRUE, use.names = TRUE))
    lapply(1:2, function(ind) dplyr::bind_rows(lapply(out, `[[`, ind)))
    

    【讨论】:

      【解决方案2】:

      这是一种使用rlistpurr 的方法

      do.call(rlist::list.zip, out) %>%
       purrr::map(~ do.call(rbind, .))
      

      或者,还有更多purrr

      library(purrr)
      
      out %>%
        do.call(rlist::list.zip, .) %>%
        map(~ reduce(., rbind))
      

      【讨论】:

      • 感谢您的正确快速回答!!
      猜你喜欢
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 2019-05-07
      • 2017-05-10
      • 2018-06-21
      • 2020-07-07
      • 1970-01-01
      • 2022-11-22
      相关资源
      最近更新 更多