【问题标题】:Bind rows of the dataframes in a list with the same name将数据框的行绑定到具有相同名称的列表中
【发布时间】:2018-08-12 14:52:01
【问题描述】:

如果已经回答了这个问题,请提前道歉。我有以下数据框列表。

 my_list <- list(a = data.frame(a1 = c(1,2), b1 = c(3,4), c1 =c(5,6)),
                 b = data.frame(b1 = c(1,2,3)),
                 a = data.frame(a1 = c(11,21), b1 = c(31,41), c1 =c(51,61)),
                 b = data.frame(b1 = c(12,22)))

如何使用 purr 将列表中所有数据框的行绑定到同名?在此示例中,所需的结果是包含两个数据帧 a 和 b 的列表。

list(a = bind_rows(data.frame(a1 = c(1,2), b1 = c(3,4), c1 =c(5,6)),
                   data.frame(a1 = c(11,21), b1 = c(31,41), c1 =c(51,61))),
     b = bind_rows(data.frame(b1 = c(1,2)),
                   data.frame(b1 = c(12,22))))

我如何使用 bind_rows 解决方案来概括具有相同名称的列表元素。谢谢!

【问题讨论】:

  • my_list %&gt;% split(names(.)) %&gt;% map(bind_rows)

标签: r list dataframe tidyverse purrr


【解决方案1】:

使用tapplybind_rows,将names(my_list) 作为INDEX(或组变量)传递:

tapply(my_list, names(my_list), dplyr::bind_rows)

#$a
#  a1 b1 c1
#1  1  3  5
#2  2  4  6
#3 11 31 51
#4 21 41 61

#$b
#  b1
#1  1
#2  2
#3  3
#4 12
#5 22

或者另一个选项,split 首先是列表,然后是 map 通过每个组和 bind_rows(没有注意到 @alistaire 在评论中提供了这个选项,但为了完整起见,会在答案中保留这个选项除非反对):

library(purrr)

split(my_list, names(my_list)) %>% map(dplyr::bind_rows)
# could also use baseR solution as from @Rich Scriven 
# split(my_list, names(my_list)) %>% map(do.call, what='rbind')

#$a
#  a1 b1 c1
#1  1  3  5
#2  2  4  6
#3 11 31 51
#4 21 41 61

#$b
#  b1
#1  1
#2  2
#3  3
#4 12
#5 22

【讨论】:

  • 非常好。如果我们使用tapply(my_list, names(my_list), do.call, what = "rbind"),也可以使用rbind
  • 非常感谢。鉴于它可以完成工作,我会将其标记为有用。然而,这不是使用 purr,我的主要问题是了解如何使用 map 或其他一些 purr 函数来做到这一点。
  • AFAIK,purrr 中没有对应的函数相当于 tapplysplit,它本质上是组然后应用。所以真的想不出一个纯粹的 purrr 方式来做到这一点。
【解决方案2】:

这是==的选项

names(my_list) %>% 
     unique %>% 
     map(~ my_list[names(my_list)==.x] %>% 
       bind_rows)
#[[1]]
#  a1 b1 c1
#1  1  3  5
#2  2  4  6
#3 11 31 51
#4 21 41 61

#[[2]]
#  b1
#1  1
#2  2
#3  3
#4 12
#5 22

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    相关资源
    最近更新 更多