[英]merging lists of dataframes in R effectively
我有 12 组 4 个列表,其中包含 2 到 13 个数据框,我想将它们合并为一组 4 个数据框列表。
虽然我称它们为集合,但它们只是简单地存储在全局环境中:list_a_1、list_b_1、list_c_1、list_d_1、list_a_2、list_b_2、list_c_2、list_d_2、...
list_a_1 ~ list_a_12 将具有具有完全相同名称和相同列的数据框。
我想要的结果是 4 个列表,其中包含合并的所有 12 组数据框。
df1 = data.frame(A = 1:5, B = 100:104)
df2 = data.frame(C = 6:10, D = 100:104)
list_a_1 = list(df1, df2)
list_a_2 = list(df1, df2)
desired_outcome
df1
A B
1 1 100
2 2 101
3 3 102
4 4 103
5 5 104
6 1 100
7 2 101
8 3 102
9 4 103
10 5 104
df2
C D
1 6 100
2 7 101
3 8 102
4 9 103
5 10 104
6 6 100
7 7 101
8 8 102
9 9 103
10 10 104
我尝试用 rbind、append、merge ... 等编写一个函数,目的是将它与 lapply 一起使用,但似乎无法正确使用。 由于每个列表都相当大,因此效率也是一个重要因素。
由于这些是rbind
相应元素,因此在base R
使用Map
Map(rbind, list_a_1, list_a_2)
#[[1]]
# A B
#1 1 100
#2 2 101
#3 3 102
#4 4 103
#5 5 104
#6 1 100
#7 2 101
#8 3 102
#9 4 103
#10 5 104
#[[2]]
# C D
#1 6 100
#2 7 101
#3 8 102
#4 9 103
#5 10 104
#6 6 100
#7 7 101
#8 8 102
#9 9 103
#10 10 104
或者循环遍历一个list
的序列,根据索引和rbind
提取每个list
lapply(seq_along(list_a_1), function(i) rbind(list_a_1[[i]], list_a_2[[i]]))
对于多个lists
,我们可以使用
v1 <- paste0('list_', letters[1:4], "_", rep(1:2, each = 4))
然后使用mget
lst1 <- mget(v1)
或者这可以使用正则表达式模式自动完成
list_b_1 <- list_a_1
list_b_2 <- list_a_2
list_c_1 <- list_a_1
list_c_2 <- list_a_2
list_d_1 <- list_a_1
list_d_2 <- list_a_2
nms <- ls(pattern = '^list_[a-d]_\\d+$')
lst1 <- mget(nms)
grps <- sub("list_([a-d])_\\d+", "\\1", nms)
lst2 <- split(lst1, grps)
out <- lapply(lst2, function(lstnew) do.call(Map, c(f = rbind, unname(lstnew))))
- 检查输出
out$a
[[1]]
A B
1 1 100
2 2 101
3 3 102
4 4 103
5 5 104
6 1 100
7 2 101
8 3 102
9 4 103
10 5 104
[[2]]
C D
1 6 100
2 7 101
3 8 102
4 9 103
5 10 104
6 6 100
7 7 101
8 8 102
9 9 103
10 10 104
对于“d”对象
out$d
[[1]]
A B
1 1 100
2 2 101
3 3 102
4 4 103
5 5 104
6 1 100
7 2 101
8 3 102
9 4 103
10 5 104
[[2]]
C D
1 6 100
2 7 101
3 8 102
4 9 103
5 10 104
6 6 100
7 7 101
8 8 102
9 9 103
10 10 104
或者来自purrr
map2
library(dplyr)
library(purrr)
map2(list_a_1, list_a_2, bind_rows)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.