R:将列表中的每个数据框与数据框中的不同列合并
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()
?我试过了,但我唯一能做的就是将列表的每个元素与单个数据帧的 each 行组合,这是我不想要的。
提前感谢您提供任何有创意的解决方案!
您可以在每一行 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)
你现在基本达到了:
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
这是使用 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
我正在尝试将数据帧列表中的每个数据帧与单个数据帧的不同列合并。也就是说,列表元素 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()
?我试过了,但我唯一能做的就是将列表的每个元素与单个数据帧的 each 行组合,这是我不想要的。
提前感谢您提供任何有创意的解决方案!
您可以在每一行 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)
你现在基本达到了:
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
这是使用 lapply()
和 cbind()
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