Map() 和 dplyr 连接
Map() and dplyr joins
我有两个列表,它们都包含对应于不同年份的相似数据集。我希望逐个元素地合并两个列表中的数据集。当我使用 mapply
和 dplyr::full_join
时,在变量名称不匹配且我需要使用 by
参数的情况下,R 无法执行连接。
library(dplyr)
set.seed(100)
first_list <- list(data.frame(x = 1:3, y = rnorm(3)),
data.frame(x = 4:6, y = rnorm(3)))
second_list <- list(data.frame(z = 1:3, w = rnorm(3)),
data.frame(z = 4:6, w = rnorm(3)))
Map(full_join, by = c("x" = "z"), first_list, second_list)
#Error: 'z' column not found in rhs, cannot join
然而,
Map(function(x, y) full_join(x, y, by = c("x" = "z")), first_list, second_list)
运行成功。我对这种行为很好奇,想知道是否有人可以提供一些解释。
因为 Map
是 mapply
的包装器,使用它的 MoreArgs 参数,而其他必需的参数 (...) 包括要矢量化的列表结束(参见 ?mapply
):
test1 <- Map(full_join, first_list, second_list, MoreArgs=list(by = c("x" = "z")))
test2 <- Map(function(x, y) full_join(x, y, by = c("x" = "z")), first_list, second_list)
all.equal(test1, test2)
# [1] TRUE
我有两个列表,它们都包含对应于不同年份的相似数据集。我希望逐个元素地合并两个列表中的数据集。当我使用 mapply
和 dplyr::full_join
时,在变量名称不匹配且我需要使用 by
参数的情况下,R 无法执行连接。
library(dplyr)
set.seed(100)
first_list <- list(data.frame(x = 1:3, y = rnorm(3)),
data.frame(x = 4:6, y = rnorm(3)))
second_list <- list(data.frame(z = 1:3, w = rnorm(3)),
data.frame(z = 4:6, w = rnorm(3)))
Map(full_join, by = c("x" = "z"), first_list, second_list)
#Error: 'z' column not found in rhs, cannot join
然而,
Map(function(x, y) full_join(x, y, by = c("x" = "z")), first_list, second_list)
运行成功。我对这种行为很好奇,想知道是否有人可以提供一些解释。
因为 Map
是 mapply
的包装器,使用它的 MoreArgs 参数,而其他必需的参数 (...) 包括要矢量化的列表结束(参见 ?mapply
):
test1 <- Map(full_join, first_list, second_list, MoreArgs=list(by = c("x" = "z")))
test2 <- Map(function(x, y) full_join(x, y, by = c("x" = "z")), first_list, second_list)
all.equal(test1, test2)
# [1] TRUE