如何将两个数据框列表与连接的数据框一起获得第三个列表?

How to join two lists of data frames obtaining a third list with the joined data frames?

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

请注意,list1中的数据框不一定与list2中的数据框长度相同,list1中的数据框的数据列为与 list2.

中的名称不同

这是一个缩小的例子:

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

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

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

我这样做的方法是使用 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 个元素传递给第三个参数中的函数。第四个参数也传递给函数。