如何将两个数据框列表与连接的数据框一起获得第三个列表?
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 个元素传递给第三个参数中的函数。第四个参数也传递给函数。
我有两个列表,每个列表有 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 个元素传递给第三个参数中的函数。第四个参数也传递给函数。