如何在dplyr的left_join中用字符变量指定关联键?
解决dplyr left_join用变量指定不同关联键的问题
问题出在你写的c(key_aaa = key_bbb)里——这里的key_aaa会被当成字面列名,而不是取变量key_aaa存储的"a",所以dplyr会去数据框aaa里找名为"key_aaa"的列,自然找不到导致报错。
给你三种可行的解决方法:
方法1:构造命名向量(最直观)
先手动创建符合要求的命名向量,再传入by参数:
key_aaa <- "a" key_bbb <- "c" # 构造key映射:名字是aaa的键列,值是bbb的键列 by_mapping <- setNames(key_bbb, key_aaa) aaa_join_bbb <- aaa %>% left_join(bbb, by = by_mapping)
setNames(key_bbb, key_aaa)会生成c(a = "c"),和你直接写固定列名的格式完全一致。
方法2:用join_by+非标准求值(dplyr 1.1.0+)
如果你的dplyr版本在1.1.0及以上,可以用join_by()函数,支持动态指定列名:
library(dplyr) key_aaa <- "a" key_bbb <- "c" aaa_join_bbb <- aaa %>% left_join(bbb, by = join_by(!!sym(key_aaa) == !!sym(key_bbb)))
sym()把字符串转成列名符号,!!用于解引用变量,让dplyr识别出这是要关联的列。这种方式在多键关联时更清晰。
方法3:用rlang的set_names(tidyverse风格)
和方法1原理类似,用rlang包的函数构造映射:
library(rlang) key_aaa <- "a" key_bbb <- "c" aaa_join_bbb <- aaa %>% left_join(bbb, by = set_names(key_bbb, key_aaa))
效果和方法1完全相同,只是用了rlang的函数替代基础R的setNames。
内容的提问来源于stack exchange,提问作者emaoca
相关产品推荐
相关产品推荐

