[英]R: Merge each dataframe in a list with a different column in a dataframe
我正在嘗試將數據幀列表中的每個數據幀與單個數據幀的不同列合並。 也就是說,列表元素 1 中的數據幀應與單個數據幀的第 1 行合並,列表元素 2 中的數據幀應與單個數據幀的第 2 行合並,依此類推。 舉個例子更容易理解。
這是我的數據框列表:
df1 <- data.frame(col1 = 11:14, col2 = 11:14)
df2 <- data.frame(col1 = 12:15, col2 = 12:15)
df3 <- data.frame(col1 = 13:16, col2 = 13:16)
df_list <- list(df1, df2, df3)
所以df_list
看起來像這樣:
[[1]]
col1 col2
1 11 11
2 12 12
3 13 13
4 14 14
[[2]]
col1 col2
1 12 12
2 13 13
3 14 14
4 15 15
[[3]]
col1 col2
1 13 13
2 14 14
3 15 15
4 16 16
這是我的單個數據框:
df_to_merge <- data.frame(col3 = 1:3, col4 = 4:6)
col3 col4
1 1 4
2 2 5
3 3 6
我可以通過循環輕松實現我想要的結果:
what_i_want <- list()
for (i in 1:nrow(df_to_merge)) {
what_i_want[[i]] <- merge.data.frame(df_list[[i]], df_to_merge[i, ])
}
這使:
[[1]]
col1 col2 col3 col4
1 11 11 1 4
2 12 12 1 4
3 13 13 1 4
4 14 14 1 4
[[2]]
col1 col2 col3 col4
1 12 12 2 5
2 13 13 2 5
3 14 14 2 5
4 15 15 2 5
[[3]]
col1 col2 col3 col4
1 13 13 3 6
2 14 14 3 6
3 15 15 3 6
4 16 16 3 6
有沒有更優雅的方法來組合例如lapply()
和apply()
? 還是mapply()
? 我試過了,但我唯一能管理的就是將列表的每個元素與單個數據幀的每一行結合起來,這是我不想要的。
在此先感謝您提供任何創造性的解決方案!
你現在基本上在那里:
what_i_want <- lapply(seq_along(df_list), function(i) { merge.data.frame(df_list[[i]], df_to_merge[i,]) })
結果:
> what_i_want
[[1]]
col1 col2 col3 col4
1 11 11 1 4
2 12 12 1 4
3 13 13 1 4
4 14 14 1 4
[[2]]
col1 col2 col3 col4
1 12 12 2 5
2 13 13 2 5
3 14 14 2 5
4 15 15 2 5
[[3]]
col1 col2 col3 col4
1 13 13 3 6
2 14 14 3 6
3 15 15 3 6
4 16 16 3 6
您可以在每一行split
df_to_merge
並使用Map
進行cbind
Map(cbind, df_list, split(df_to_merge, seq_len(nrow(df_to_merge))))
#[1]]
# col1 col2 col3 col4
#1 11 11 1 4
#2 12 12 1 4
#3 13 13 1 4
#4 14 14 1 4
#[[2]]
# col1 col2 col3 col4
#1 12 12 2 5
#2 13 13 2 5
#3 14 14 2 5
#4 15 15 2 5
#[[3]]
# col1 col2 col3 col4
#1 13 13 3 6
#2 14 14 3 6
#3 15 15 3 6
#4 16 16 3 6
相同邏輯的一種tidyverse
方式可能是
library(dplyr)
library(purrr)
map2(df_list, df_to_merge %>% group_split(row_number(), keep = FALSE), cbind)
這是使用lapply()
和cbind()
的基本 R 解決方案
dfout <- lapply(seq(df_list), function(k) cbind(df_list[[k]],df_to_merge[k,],row.names = NULL))
以至於
> dfout
[[1]]
col1 col2 col3 col4
1 11 11 1 4
2 12 12 1 4
3 13 13 1 4
4 14 14 1 4
[[2]]
col1 col2 col3 col4
1 12 12 2 5
2 13 13 2 5
3 14 14 2 5
4 15 15 2 5
[[3]]
col1 col2 col3 col4
1 13 13 3 6
2 14 14 3 6
3 15 15 3 6
4 16 16 3 6
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.