代码之家  ›  专栏  ›  技术社区  ›  Abdel

R:合并两个匹配的数据帧列表

  •  1
  • Abdel  · 技术社区  · 6 年前

    我有两个由相同数量的数据帧组成的列表,两个列表中数据帧的顺序指示哪些数据帧属于一起。换句话说,第一个列表中的第一个数据帧与第二个数据帧中的第一个列表一起使用,第二个数据帧与第二个数据帧一起使用,等等。我希望将两个列表中的数据帧彼此合并,但只合并属于一起的数据帧。假设第一个列表有这三个数据帧:

    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
    

    我该怎么做?

    3 回复  |  直到 6 年前
        1
  •  3
  •   Iman    6 年前

    第一个数据集列表:

    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
  •  1
  •   moodymudskipper    6 年前

    使用 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
  •  1
  •   G. Grothendieck    6 年前

    使用 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)