R语言dplyr::select如何使用存储列索引的外部变量选列
报错原因
dplyr默认采用整洁求值(tidy eval)语义,select()中传入的未做特殊标记的符号,会被优先识别为输入数据框的内部列名,不会主动到全局环境中查找同名变量。你写的select(col_to_select)会直接尝试在mtcars中寻找名为col_to_select的列,自然会触发列不存在的报错。
正确写法
使用dplyr官方为这类「外部存储列选择参数」场景设计的all_of()代词注入变量值即可,这是当前版本最推荐的稳定写法:
library(dplyr) # 存储列索引的外部变量 col_to_select = 2 # 完成列选取 mtcars %>% select(all_of(col_to_select))
上述代码运行后会正确选中mtcars的第2列(cyl列),无报错。
补充说明
all_of()对传入值的兼容性很好,不管你的外部变量存的是数值型列位置索引,还是字符型的列名,都能正常识别- 如果你不确定变量中存储的列/索引是否一定存在,可以替换为
any_of(),遇到不存在的列会自动跳过,不会中断代码运行 - 不建议使用旧资料中提到的
!!col_to_select注入写法,这类写法在当前dplyr版本中不是列选择场景的最优实践,可读性和鲁棒性都弱于all_of()/any_of()
内容的提问来源于stack exchange,提问作者Lenn
相关产品推荐
相关产品推荐

