dplyr:如何将tidy-select表达式赋值给变量以复用
解决方法
直接将contains("p")赋值给变量无法运行,是因为这类tidy-select选择器函数需要在特定的上下文(比如across/if_all内部)才能解析生效。可以通过以下两种方式实现选择器的复用:
方法1:保存为引用表达式
使用rlang::quo()将选择器表达式包装为引用对象(quosure),再通过!!(解引用运算符)在函数中展开使用:
library(dplyr) library(rlang) # 保存选择器表达式 my_cols <- quo(contains("p")) # 复用变量 my_df <- mtcars %>% filter(if_all(!!my_cols, is.numeric)) %>% mutate(across(!!my_cols, as.character))
方法2:先解析为列名再复用
先用tidyselect::eval_select()解析选择器得到具体列名,再用all_of()在across/if_all中引用列名向量:
library(dplyr) library(tidyselect) # 解析选择器得到目标列名 my_cols <- names(eval_select(quo(contains("p")), data = mtcars)) # 复用列名向量 my_df <- mtcars %>% filter(if_all(all_of(my_cols), is.numeric)) %>% mutate(across(all_of(my_cols), as.character))
两种方式的差异:
- 方法1保留选择器的动态性,后续数据框列名变动时会自动重新匹配;
- 方法2使用固定列名,适合列名不会变化的场景。
内容的提问来源于stack exchange,提问作者simplyPTA
相关产品推荐
相关产品推荐

