【问题标题】:combining data frames from two lists合并来自两个列表的数据框
【发布时间】:2021-06-05 15:51:22
【问题描述】:

我有两个数据框列表。在每个列表中,数据框都有一个具有相同名称和值的列。举个例子:

x <- list(data.frame(i=as.character(1:5),x=rnorm(5),z=rnorm(5)),
          data.frame(i=as.character(1:5),x=rnorm(5),z=rnorm(5)))

y <- list(data.frame(i=as.character(5:1),x1=rnorm(5),z1=rnorm(5)),
          data.frame(i=as.character(5:1),x1=rnorm(5),z1=rnorm(5)))

我想将两个列表合并为一个,这样新列表的每个元素都是一个包含以下列的数据框:i, x, z, x1, z1)。那就是我想要一个包含两个数据框的列表,每个数据框有五行和我提到的五列。我找不到解决方案(例如,找到了如何在一个 df 的列表中连接 dfs)。我想使用lapply 并传递函数merge(x,y, by= i),但我不知道第一个参数(即使用的数据)应该是什么。 请注意,公共列中的值的顺序不同(在示例中它们是相反的,但在我的数据中它们是混合的)。因此,如果您的解决方案需要先订购色谱柱,请告诉我。谢谢。

【问题讨论】:

    标签: r


    【解决方案1】:
    library(tidyverse)
    map2(x, y, ~left_join(.x, .y, by = 'i'))
    #> [[1]]
    #>   i          x         z         x1         z1
    #> 1 1 -0.8773188  1.204293  1.2809946  0.9016632
    #> 2 2 -0.4091583 -1.128325  0.7973242 -0.1010260
    #> 3 3  1.3747095  0.784787 -1.6927698 -1.1568878
    #> 4 4  0.7565917 -1.104594  1.0663122 -0.1439810
    #> 5 5  0.9662782 -1.039493 -0.2620102 -0.4941850
    #> 
    #> [[2]]
    #>   i         x          z         x1          z1
    #> 1 1 0.7871544 -1.0974764  1.2926863  0.99399623
    #> 2 2 1.3705341 -0.1047783  1.3612606 -0.01155390
    #> 3 3 0.9984027 -0.2466980  0.4554107 -1.38307942
    #> 4 4 0.7096952  0.7500738 -0.4586198  0.02311739
    #> 5 5 0.1883204 -0.6399546  0.1496794 -0.43233764
    

    它的 baseR 等价物

    Map(function(.x, .y) merge(.x, .y, by = 'i'), x, y)
    #> [[1]]
    #>   i            x           z         x1         z1
    #> 1 1  1.163081705  0.71855088  0.7981572  0.1029179
    #> 2 2  0.876645119 -0.08615626  0.7299087  0.9782025
    #> 3 3 -1.460452798 -0.14551233 -0.3380226 -1.1168602
    #> 4 4 -0.004574267 -0.36117459  0.2183281 -0.9045827
    #> 5 5 -0.836010524  0.12336598 -0.9046551 -0.2670896
    #> 
    #> [[2]]
    #>   i          x          z          x1         z1
    #> 1 1 -1.1605742  0.3233873 -0.16685367 -1.0579590
    #> 2 2  1.5723944  0.5120253 -0.66373500  0.3241323
    #> 3 3 -1.5562135  1.1251436  0.06805823 -2.2889400
    #> 4 4  0.2782484  0.4134606 -0.11763939 -0.9060669
    #> 5 5 -0.4821373 -0.7170258  0.72466946 -1.4457480
    

    reprex package (v2.0.0) 于 2021-06-05 创建

    【讨论】:

      【解决方案2】:

      看起来这就是你想要的:

      map2(x, y, ~ inner_join(.x, .y))
      
      [[1]]
        i          x          z         x1         z1
      1 1  0.7715183 -0.6933826 -0.3335239  0.5957587
      2 2 -0.3824746 -0.7248827 -1.6736241 -1.2248904
      3 3  0.3412777 -0.3711940  0.9334678  0.4043867
      4 4 -0.4225862 -1.6653314  1.0369985  1.1808140
      5 5  0.7468157  0.1704126 -0.1470796 -1.6237296
      
      [[2]]
        i           x          z         x1          z1
      1 1  0.69264103 -0.6640663 -0.2253319  0.26323254
      2 2 -0.07861775  0.7914119  0.3725911  0.02854667
      3 3 -0.86588724 -0.5519633 -1.5114177 -0.14283509
      4 4  1.16069947  1.1299540 -0.4207173 -1.15829758
      5 5  2.13867104 -0.9668079  0.1082068 -2.74714297
      

      【讨论】:

      • 对不起,kitu。我可能不清楚所需的输出。我想要的输出将是一个包含两个数据框的列表。每个 df 将有 5 行和 5 列。
      • 我改变了我的答案:)
      • kitu,它适用于我的示例。但根据我的数据,它没有。这是代码和错误 final 我应该有 .x和inner_joint中的.y?
      • 是的,试试map2(results1, results2, ~ inner_join(.x, .y))
      • 非常好的亲爱的ktiu :)
      【解决方案3】:

      使用{dplyr}{purrr}

      purrr::map2(x, y, dplyr:::left_join, by = 'i')
      

      【讨论】:

      • Encuestas,这会创建一个单一的数据框。我需要一个列表中的两个数据框。
      • 谢谢,Encuestas,这很好用。因为我已经接受了一个答案,所以我会支持你的。
      【解决方案4】:

      使用data.table

      library(data.table)
      Map(function(u, v) setDT(u)[v, on = .(i)], x, y)
      

      【讨论】:

        【解决方案5】:

        我认为我们也可以使用以下解决方案:

        library(purrr)
        
        map2(x, y, ~ .x %>%  bind_cols(.y %>% select(-i)))
        
        [[1]]
          i           x          z         x1         z1
        1 1  0.17590858 -2.5917377 -0.5603591  0.5810495
        2 2  0.03199955 -0.1387498 -0.5948580 -1.5914561
        3 3 -1.51798345 -0.1991066  0.5550439  0.9111812
        4 4  0.03178260  2.4638499 -1.1169747  0.6084738
        5 5  2.41686436 -0.7952663  0.4207237  0.5133366
        
        [[2]]
          i           x           z         x1         z1
        1 1 -0.07731912 -0.08303112  1.2116506 -1.0381454
        2 2 -0.88351320 -1.50888504  0.8762129  1.5319386
        3 3 -0.04033662  0.48264589 -0.3644170 -1.3051433
        4 4  0.81795108  0.22947344  0.7192894 -1.2796247
        5 5  1.19298096  2.29746662  0.9020253  0.8600827
        

        【讨论】:

          猜你喜欢
          • 2022-11-23
          • 2019-09-19
          • 1970-01-01
          • 2018-05-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多