繁体   English   中英

有效地合并 R 中的数据框列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM