R:将列表中的每个数据框与数据框中的不同列合并

时间:2019-12-19 11:14:24

标签: r lapply mapply

我正在尝试将数据框列表中的每个数据框与单个数据框的不同列合并。也就是说,列表元素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()?我尝试过,但是我唯一能做的就是将列表中的每个元素与单个数据帧的行合并,

提前感谢任何创意解决方案!

3 个答案:

答案 0 :(得分:2)

您现在基本上就在那儿

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

答案 1 :(得分:1)

您可以在每行split df_to_merge上使用Mapcbind

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)

答案 2 :(得分:0)

这是使用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