【问题标题】:R: merge two lists of matched dataframesR:合并两个匹配的数据框列表
【发布时间】:2018-07-29 12:52:31
【问题描述】:

我有两个列表,它们包含相同数量的数据帧,两个列表中数据帧的顺序表示哪些数据帧属于一起。换句话说,第一个列表中的第一个数据帧与第二个数据帧中的第一个列表一起,第二个与第二个列表一起,等等。我想将两个列表中的数据帧相互合并,但只有数据帧永远在一起。假设第一个列表有这三个数据框:

df1:
id var1
1 0.2
2 0.1
3 0.4
4 0.3

df2:
id var1
1 0.2
6 0.5

df3:
id var1
1 0.2
3 0.1
6 0.4

第二个列表有以下数据框:

df1:
id var2
1 A
2 B
3 C
4 C

df2:
id var2
1 B
6 B

df3:
id var2
1 A
3 D
6 D

我想根据变量“id”合并它们,最终结果如下:

df1:
id var1 var2
1 0.2 A
2 0.1 B 
3 0.4 C
4 0.3 C

df2:
id var1 var2
1 0.2 B
6 0.5 B

df3:
id var1 var2
1 0.2 A 
3 0.1 D
6 0.4 D

我该怎么做?

【问题讨论】:

  • 您可以将Mapmerge 一起使用,或者与tidyverse 一起使用map2inner_join。如果您将数据的dput 提供给您,将更容易给您答案

标签: r list merge


【解决方案1】:

第一个数据集列表:

list1<-list(df1,df2,df3)

第二个数据集列表:

list2<-list(df1,df2,df3)

结果:

lapply(1:length(list1),function(x) {merge(list1[[x]], list2[[x]], by.x = 'id')}) 

【讨论】:

    【解决方案2】:

    使用tidyverse 或基础R

    Map(merge,l1,l2)
    
    library(tidyverse)
    map2(l1,l2,inner_join)
    
    # [[1]]
    #   id   a b
    # 1  1 0.1 A
    # 2  2 0.2 B
    # 
    # [[2]]
    #   id   a b
    # 1  1 0.1 A
    # 2  2 0.2 B
    # 
    # [[3]]
    #   id   a b
    # 1  1 0.1 A
    # 2  2 0.2 B
    # 
    

    数据

    l1 <- replicate(3,data.frame(id= 1:2,a=c(0.1,0.2)),F)
    
    l1
    # [[1]]
    # id   a
    # 1  1 0.1
    # 2  2 0.2
    # 
    # [[2]]
    # id   a
    # 1  1 0.1
    # 2  2 0.2
    # 
    # [[3]]
    # id   a
    # 1  1 0.1
    # 2  2 0.2
    
    l2 <- replicate(3,data.frame(id= 1:2,b=c("A","B")),F)
    l2
    # [[1]]
    #   id b
    # 1  1 A
    # 2  2 B
    # 
    # [[2]]
    #   id b
    # 1  1 A
    # 2  2 B
    # 
    # [[3]]
    #   id b
    # 1  1 A
    # 2  2 B
    # 
    

    【讨论】:

      【解决方案3】:

      像这样使用Map

      Map(merge, L1, L2)
      

      给予:

      $`df1`
        id var1 var2
      1  1  0.2    A
      2  2  0.1    B
      3  3  0.4    C
      4  4  0.3    C
      
      $df2
        id var1 var2
      1  1  0.2    B
      2  6  0.5    B
      
      $df3
        id var1 var2
      1  1  0.2    A
      2  3  0.1    D
      3  6  0.4    D
      

      注意

      可重现形式的输入列表是:

      Lines1 <- "df1:
      id var1
      1 0.2
      2 0.1
      3 0.4
      4 0.3
      
      df2:
      id var1
      1 0.2
      6 0.5
      
      df3:
      id var1
      1 0.2
      3 0.1
      6 0.4"
      Read <- function(Lines) {
       L <- readLines(textConnection(Lines))
       ix <- grep(":", L)
       nms <- sub(":", "", L[ix])
       g <- nms[cumsum(L[-ix] == "")+1]
       lapply(split(L[-ix], g), function(x) read.table(text = x, header = TRUE))
      }
      L1 <- Read(Lines1)
      

      Lines2 <- "df1:
      id var2
      1 A
      2 B
      3 C
      4 C
      
      df2:
      id var2
      1 B
      6 B
      
      df3:
      id var2
      1 A
      3 D
      6 D"
      L2 <- Read(Lines2)
      

      【讨论】:

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