【问题标题】:How to join two lists of data frames obtaining a third list with the joined data frames?如何连接两个数据框列表,获得第三个列表与连接的数据框?
【发布时间】:2017-09-21 16:39:14
【问题描述】:

我有两个列表,每个列表包含 18 个数据框,其中包含两列,一列包含 id,另一列包含数据。我的目标是通过 id 列完全连接两个列表的数据帧(list1 的第一个与list2 的第一个等等),以便生成 18 个数据帧(再次存储在列表中)每个都有 3 列(一个 id 列,两个数据列)。

请注意list1 中的数据帧不一定与list2 中的数据帧具有相同的长度,并且list1 中数据帧的数据列与@987654326 中的数据列名称不同@。

这是一个缩小的例子:

list1 <- list(df1 = data.frame(id_col = c(1:3), data_1 = letters[1:3]),
              df2 = data.frame(id_col = c(1:4), data_1 = letters[1:4]))
list2 <- list(df1 = data.frame(id_col = c(1:4), data_2 = LETTERS[1:4]), 
              df2 = data.frame(id_col = c(1:7), data_2 = LETTERS[1:7]))

我想解决方案是这样的:

mapply(function(x, y) {
  # some function with e. g. dplyr::full_join 
  }, x = list1, y = list2)

【问题讨论】:

    标签: r list dataframe mapply


    【解决方案1】:
    list3 <- lapply(1:length(list1), 
                    function(x) merge(list1[[x]], 
                                      list2[[x]], 
                                      by = "id_col"))
    list3
    # [[1]]
    #   id_col data_1 data_2
    # 1      1      a      A
    # 2      2      b      B
    # 3      3      c      C
    # 
    # [[2]]
    #   id_col data_1 data_2
    # 1      1      a      A
    # 2      2      b      B
    # 3      3      c      C
    # 4      4      d      D
    

    如果您想要完全加入,请指定all = TRUE

    list3 <- lapply(1:length(list1), 
                    function(x) merge(list1[[x]], 
                                      list2[[x]], 
                                      by = "id_col",
                                      all = TRUE))
    list3
    # [[1]]
    #   id_col data_1 data_2
    # 1      1      a      A
    # 2      2      b      B
    # 3      3      c      C
    # 4      4   <NA>      D
    # 
    # [[2]]
    #   id_col data_1 data_2
    # 1      1      a      A
    # 2      2      b      B
    # 3      3      c      C
    # 4      4      d      D
    # 5      5   <NA>      E
    # 6      6   <NA>      F
    # 7      7   <NA>      G
    

    【讨论】:

      【解决方案2】:

      这是purrr::map2 的工作:) :

      map2(list1,list2,~merge(.x,.y))
      
      # $df1
      #   id_col data_1 data_2
      # 1      1      a      A
      # 2      2      b      B
      # 3      3      c      C
      # 
      # $df2
      #   id_col data_1 data_2
      # 1      1      a      A
      # 2      2      b      B
      # 3      3      c      C
      # 4      4      d      D
      

      (调整合并的参数以获得您想要的连接类型)

      【讨论】:

        【解决方案3】:

        我这样做的方法是使用purrr 循环遍历列表并使用dplyr 进行加入:

        list1 <- list(df1 = data.frame(id_col = c(1:3), data_1 = letters[1:3]),
                      df2 = data.frame(id_col = c(1:4), data_1 = letters[1:4]))
        list2 <- list(df1 = data.frame(id_col = c(1:4), data_2 = LETTERS[1:4]), 
                      df2 = data.frame(id_col = c(1:7), data_2 = LETTERS[1:7]))
        
        purrr::map2(list1, list2, dplyr::full_join, by = "id_col")
        #> $df1
        #>   id_col data_1 data_2
        #> 1      1      a      A
        #> 2      2      b      B
        #> 3      3      c      C
        #> 4      4   <NA>      D
        #> 
        #> $df2
        #>   id_col data_1 data_2
        #> 1      1      a      A
        #> 2      2      b      B
        #> 3      3      c      C
        #> 4      4      d      D
        #> 5      5   <NA>      E
        #> 6      6   <NA>      F
        #> 7      7   <NA>      G
        

        map2 遍历两个长度相等的列表,将这些列表的第 n 个元素传递给第三个参数中的函数。第四个参数也传递给函数。

        【讨论】:

          猜你喜欢
          • 2021-11-11
          • 1970-01-01
          • 2019-01-05
          • 2020-06-19
          • 1970-01-01
          • 2016-12-30
          • 2018-04-30
          • 1970-01-01
          • 2022-12-12
          相关资源
          最近更新 更多