如何在R中使用map传递参数列表实现自定义数据连接?
问题分析
你的代码核心问题在于join_by(.x==.y)的写法:.x和.y是字符串变量,但join_by需要的是变量引用而非字符串字面量,直接传入会导致连接条件无法被正确解析。
解决方案1:修正map2写法(单条件迭代连接)
如果需求是依次用list_1和list_2的对应元素作为单独连接条件(比如先按cut连接,再按color连接),需要把字符串转换成变量符号,借助sym()和!!实现tidy eval解析:
library(tidyverse) tbl1 <- diamonds %>% head(100) tbl2 <- diamonds %>% head(400) list_1 <- c("cut", "color") list_2 <- c("cut", "color") map2( .x = list_1, .y = list_2, .f = ~left_join( tbl1, tbl2, by = join_by(!!sym(.x) == !!sym(.y)), multiple = "first" ) )
执行后会返回一个包含两个数据框的列表,分别对应按cut、color单独连接的结果。
解决方案2:非迭代实现(多条件同时连接)
如果需求是同时用list_1和list_2里的所有字段作为连接条件(比如同时按cut+color连接),无需迭代,直接构造条件即可:
方式A:适配变量名不同的场景
left_join( tbl1, tbl2, by = join_by(across(all_of(list_1)) == across(all_of(list_2))), multiple = "first" )
方式B:变量名相同时的简化写法
因为你的list_1和list_2内容完全一致,还可以进一步简化:
left_join( tbl1, tbl2, by = list_1, multiple = "first" )
关于rowwise的说明
rowwise主要用于数据框的逐行计算,并不适合构造连接条件的场景,因此不推荐用它来实现这个需求。
内容的提问来源于stack exchange,提问作者alejandro_hagan
相关产品推荐
相关产品推荐

