【问题标题】:merging lists of dataframes in R effectively有效地合并 R 中的数据框列表
【发布时间】:2020-09-11 07:10:44
【问题描述】:

我有 12 组 4 个列表,其中包含 2 到 13 个数据帧 我想将它们合并到一组 4 个数据框列表中。

虽然我称它们为集合,但它们只是存储在 Global Environment 中,如下所示: list_a_1, 列表_b_1, 列表_c_1, 列表_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 一起使用,但似乎无法正确使用。 由于每个列表都很大,效率也是一个重要因素。

【问题讨论】:

标签: r dataframe


【解决方案1】:

由于这些是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提取每个

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

map2 来自purrr

library(dplyr)
library(purrr)
map2(list_a_1, list_a_2, bind_rows)

【讨论】:

  • 谢谢!以下代码运行良好:out &lt;- lapply(lst2, function(lstnew) do.call(Map, c(f = rbind, unname(lstnew)))) 虽然由于内存不足,我不得不一次做一组,这真的很有帮助!
猜你喜欢
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
相关资源
最近更新 更多