如何在R的left_join中使用处理后的列实现左连接?
R语言实现带字段截取的左连接
需求说明
需要对数据框Savings_YC和WAP_FULL执行左连接,连接条件为:
Client字段完全匹配Savings_YC的CompanyCode字段取前4位,与WAP_FULL的CompanyCode匹配Material、STOCK_UOM字段完全匹配
对应的SQL逻辑如下:
SELECT * FROM Savings_YC syc LEFT JOIN WAP_FULL w ON syc.Client = w.Client AND LEFT(syc.CompanyCode, 4) = w.CompanyCode AND syc.Material = w.Material AND syc.STOCK_UOM = w.STOCK_UOM
错误尝试代码
用户尝试直接在left_join的by参数中使用substr函数,导致报错:
Savings_YC <- Savings_YC %>% left_join(WAP_FULL, by = c("Client", substr("Savings_YC.CompanyCode",1,4) = "WAP_FULL.CompanyCode", "Material", "STOCK_UOM"))
正确实现方式
方法1:先创建截取后的临时字段再连接
这种方式逻辑直观,便于排查问题:
# 给Savings_YC添加截取前4位的CompanyCode临时字段 Savings_YC_processed <- Savings_YC %>% mutate(CompanyCode_4 = substr(CompanyCode, 1, 4)) # 执行左连接,用临时字段匹配WAP_FULL的CompanyCode result <- Savings_YC_processed %>% left_join(WAP_FULL, by = c("Client", "CompanyCode_4" = "CompanyCode", "Material", "STOCK_UOM")) # 可选:不需要临时字段时可以删除 result <- result %>% select(-CompanyCode_4)
方法2:使用dplyr 1.1.0+的join_by函数直接定义复杂条件
如果你的dplyr版本在1.1.0及以上,可直接用join_by写连接条件,无需创建临时字段:
result <- Savings_YC %>% left_join(WAP_FULL, join_by(Client == Client, substr(CompanyCode, 1, 4) == CompanyCode, Material == Material, STOCK_UOM == STOCK_UOM))
错误原因解释
原写法的问题在于:
by参数的向量元素只能是字符串形式的字段匹配关系,无法直接嵌入substr函数调用- 字符串
"Savings_YC.CompanyCode"是字面量,并非对数据框字段的引用,substr无法处理该字符串得到目标字段的前4位
内容的提问来源于stack exchange,提问作者Jakob Orel
相关产品推荐
相关产品推荐

