dplyr的left_join函数中如何使用变量作为by连接参数
dplyr左连接使用变量作为连接列的实现方法
问题原因
直接在by参数里写c(存列名的变量 = "右表连接列")时,R会把变量本身的字面名称作为向量的名称,不会读取变量里存储的实际列名字符串,导致dplyr找不到对应列报错。
比如你运行c(var_to_join = "disp"),得到的输出是命名向量var_to_join = "disp",向量名是var_to_join,不是你预期的"disp",这就是写法不生效的核心原因。
兼容所有dplyr版本的通用写法
不管两边连接列名是否一致,都可以先构造连接用的命名向量,给向量动态赋值名称即可:
# 场景1:左表连接列存在name变量里,匹配右表的col_to_join列 name = "ID" join_by <- "col_to_join" # 向量值填右表的连接列名 names(join_by) <- name # 向量名设为左表变量存储的列名 left_join(df1, df2, by = join_by)
对应给出的mtcars测试示例,写法如下:
library(dplyr) a = mtcars %>% select(1:3) b = mtcars %>% select(3:5) var_to_join = "disp" join_by <- "disp" names(join_by) <- var_to_join left_join(a, b, by = join_by)
简化写法
如果dplyr版本在1.0.0以上,还可以根据场景选更简洁的写法:
- 两边连接列名完全一致时,直接用
all_of()包裹变量即可:
# 适用于a和b连接列名相同的场景,即示例里两边都有disp列的情况 left_join(a, b, by = all_of(var_to_join))
- dplyr 1.1.0以上版本,可以用
join_by()配合注入语法实现不同列名的匹配:
# 左表列取name变量存储的"ID",匹配右表的col_to_join列 name = "ID" left_join(df1, df2, by = join_by(!!sym(name) == col_to_join))
内容的提问来源于stack exchange,提问作者Lenn
相关产品推荐
相关产品推荐

