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