R语言dplyr中如何在join_by内通过数据掩码索引第i列
动态指定列用于join_by连接
当然可以实现动态列索引的join_by连接,核心是用dplyr支持的准引用语法来构建动态表达式,以下是两种实用方案:
方案1:预构建动态表达式
先根据索引i生成对应的列名,再用rlang::expr创建连接条件表达式,最后用!!(非标准计算的注入符)把表达式传入join_by:
library(dplyr) # 示例测试数据 a <- tibble(a.1 = 1:5, a.2 = 6:10) b <- tibble(b.1 = 3:7, b.2 = 8:12) # 指定要使用的索引i i <- 1 # 构建动态连接条件表达式 join_condition <- rlang::expr(x[[paste0("a.", i)]] < y[[paste0("b.", i)]]) # 执行内连接 inner_join(a, b, by = join_by(!!join_condition))
方案2:直接在join_by内动态生成
如果不需要复用表达式,也可以直接在join_by参数里拼接列名,写法更简洁:
i <- 2 inner_join(a, b, by = join_by(x[[paste0("a.", i)]] < y[[paste0("b.", i)]]))
注意事项
- 不要用
expression()来生成表达式,join_by无法直接解析这种原生表达式对象,必须用rlang::expr生成适配dplyr准引用系统的表达式。 - 优先用
x[[col_name]]而非x$col_name的写法,因为[[支持传入字符串变量,更适合动态列名的场景,而$只能识别字面量列名。
内容的提问来源于stack exchange,提问作者jinTgreater
相关产品推荐
相关产品推荐

