绑定具有相同名称的列表中的数据帧行

时间:2018-03-05 01:05:59

标签: r list dataframe tidyverse purrr

如果已经回答,请提前道歉。我有以下数据帧列表。

 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解决方案来推广具有相同名称的列表元素。谢谢!

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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