2017-09-21 67 views
1

我有两个列表,每列有18个数据帧,它们有两列,一列包含ids和其他数据。我的目标是通过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) 

回答

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 
2

它'对于purrr::map2 :) SA的工作:

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 

(调整合并的参数,以获得那种加入你想要的)

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个元素的功能在第:做接合第三个论点。第四个参数也传递给函数。

相关问题