我有两个列表,每个列表有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)
答案 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个元素传递给第三个参数中的函数。第四个参数也传递给函数。