【问题标题】:R: Merge each dataframe in a list with a different column in a dataframeR:将列表中的每个数据框与数据框中的不同列合并
【发布时间】:2019-12-19 11:14:24
【问题描述】:

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

提前感谢您提供任何创造性的解决方案!

【问题讨论】:

    标签: r lapply mapply


    【解决方案1】:

    你现在基本上在那里:

    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
    

    【讨论】:

      【解决方案2】:

      您可以在每一行使用splitdf_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)
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-11
          • 2014-10-22
          • 1970-01-01
          • 2018-10-28
          相关资源
          最近更新 更多