变量指定列名与筛选值时dplyr筛选返回空dataframe的解决方法
解决dplyr中变量列名筛选行的问题
碰到这种情况很正常,因为dplyr::filter()默认会把你写的col当成数据框里的列名来解析,而不是你定义的变量col的取值(也就是"X")。要让变量化的列名和筛选值生效,你需要用到dplyr的**整洁评估(tidy evaluation)**特性,这里有几种实用的解决方法:
方法1:使用{{ }}(大括号操作符)
这是dplyr 1.0.0及以上版本最推荐的方式,语法简洁直观:
D = data.frame(X = c("x1", "x2", "x3")) vals = c("x1", "x2") col = "X" # 用{{ }}注入变量列名 dplyr::filter(D, {{ col }} %in% vals)
{{ col }}会把变量col中的值("X")注入到筛选表达式中,等效于硬编码X %in% vals的效果,执行后会得到正确的结果:
X 1 x1 2 x2
方法2:使用.data代词
.data是dplyr提供的特殊代词,用来明确引用数据框内的列,适合需要动态指定列名的场景:
dplyr::filter(D, .data[[col]] %in% vals)
.data[[col]]会根据变量col的取值去提取对应列的内容,这样就能正确匹配到X列的数值进行筛选。
方法3:针对旧版dplyr(低于1.0.0):用rlang::sym() + !!
如果你的dplyr版本比较旧,可以结合rlang包的符号转换和解引用操作符:
library(rlang) dplyr::filter(D, !!sym(col) %in% vals)
sym(col)将字符串类型的列名转换成符号对象,!!(Bang-Bang操作符)会把这个符号解引用,让filter识别为对应的列名。
以上三种方法都能解决你遇到的空数据框问题,根据你的dplyr版本选择合适的方式即可。
内容的提问来源于stack exchange,提问作者Devaraj Phukan
相关产品推荐
相关产品推荐

