如何用purrr::reduce2按不同列迭代左连接R语言中的多个表?
问题解决:迭代多表按不同列左连接
你的错误出在reduce2的匿名函数参数顺序和left_join的参数传递上,具体问题和修正方案如下:
错误原因
reduce2的匿名函数中,参数顺序是:.x(累积的结果表,初始为T0)、.y(join_tables的当前元素)、.z(join_cols的当前元素),你把连接列的参数错用成了.y,实际应该对应.z。left_join的第一个参数是被连接的主表(对应累积值.x),第二个参数是要加入的表(对应.y),你错误地把主表传给了y=参数,导致x参数缺失,触发报错。
修正后的代码
library(tidyverse) # 原有的表定义保持不变 T0 <- tibble( col1 = c(1, 2, 3, 4), col2 = c("A", "B", "C", "D"), col3 = c("X", "Y", "Z", "W") ) T1 <- tibble( col1 = 1:4, var1 = 5:8 ) T2 <- tibble( col2 = c("A", "B", "C", "D"), var2 = c("AA", "BB", "CC", "DD") ) T3 <- tibble( col3 = c("X", "Y", "Z", "W"), var3 = c("XX", "YY", "ZZ", "WW") ) join_tables <- list(T1, T2, T3) join_cols <- list("col1", "col2", "col3") # 修正reduce2的调用 result <- reduce2( join_tables, join_cols, ~ left_join(x = .x, y = .y, by = .z), .init = T0 ) # 查看结果 print(result)
替代方案:用purrr::walk2结合累积赋值
如果你觉得reduce2的参数容易混淆,也可以用更直观的循环方式:
result <- T0 walk2(join_tables, join_cols, function(tbl, col) { result <<- left_join(result, tbl, by = col) })
这样就能正确完成按不同列依次左连接的操作了。
内容的提问来源于stack exchange,提问作者kenmore17
相关产品推荐
相关产品推荐

