【问题标题】:How to cbind and rbind 2 lists of dataframes如何 cbind 和 rbind 2 个数据帧列表
【发布时间】:2017-12-24 00:33:08
【问题描述】:

我有 2 个数据框列表。每个列表有 24 个数据框

list1 <- (data1, data2, ..., data24)
list2 <- (result1, result2, ...., result3)

我想cbinddata1result1data2result2 等等。然后rbind 把所有数据框都这样:

all1 <- cbind(data1, result1)
all2 <- cbind(data2, result2)
all.in <- rbind(all1, all2)

如何使用 24 个数据帧有效地做到这一点?

【问题讨论】:

    标签: r rbind cbind


    【解决方案1】:

    在 tidyverse 语法中,dplyr::bind_rowsbind_cols 将绑定一个列表,并由purrr::map_df 变体调用:

    library(tidyverse)
    
    l1 <- list(mtcars[1:2, 1, drop = FALSE], mtcars[3:4, 1, drop = FALSE])
    l2 <- list(mtcars[1:2, 2:6], mtcars[3:4, 2:6])
    
    map2_dfr(l1, l2, bind_cols)
    #>    mpg cyl disp  hp drat    wt
    #> 1 21.0   6  160 110 3.90 2.620
    #> 2 21.0   6  160 110 3.90 2.875
    #> 3 22.8   4  108  93 3.85 2.320
    #> 4 21.4   6  258 110 3.08 3.215
    

    .id 参数可以同时传递给bind_rowsmap_dfr,并会生成一个新列,其名称包含每个观察值来自哪个列表元素的索引。

    【讨论】:

      【解决方案2】:

      我可能会这样做:

      l1 <- list(mtcars,mtcars)
      l2 <- list(mtcars,mtcars)
      do.call(rbind,mapply(FUN = cbind,l1,l2,SIMPLIFY = FALSE))
      

      如果数据帧非常大,您可以切换到 cbindrbind 的 dplyr 或 data.table 等效项。

      【讨论】:

      • 而不是使用mapplysimplify=FALSE 为什么不使用Map
      • do.call(rbind,Map(cbind,l1,l2))
      • @Onyambu 因为我是老派,这就是原因。 ;)
      猜你喜欢
      • 1970-01-01
      • 2017-02-17
      • 2010-12-11
      • 1970-01-01
      • 2017-05-26
      • 2017-03-16
      • 2018-06-21
      • 1970-01-01
      • 2018-06-06
      相关资源
      最近更新 更多