如何连接两个数据帧列表,获得带有连接数据帧的第三个列表?

时间:2017-09-21 16:39:15

标签: r list dataframe mapply

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

Plesae请注意,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)

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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

(调整merge的参数以获得你想要的那种连接)

答案 2 :(得分:1)

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