簡體   English   中英

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() 我試過了,但我唯一能管理的就是將列表的每個元素與單個數據幀的每一行結合起來,這是我不想要的。

在此先感謝您提供任何創造性的解決方案!

你現在基本上在那里:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM