簡體   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