dplyr filter_无数据返回:动态筛选dataframe列的技术咨询
问题分析
你当前的代码无法返回数据,根源在于用paste0拼接过滤条件时,没有给filter[i]的字符值加上引号。生成的表达式是g==C,R会把C当成一个变量而非字符串常量,自然匹配不到你dataframe里的"C"值啦。
解决方法
我给你两种方案,一种是修复你原来的filter_写法(虽然这个函数已经被dplyr软废弃了),另一种是推荐使用dplyr的现代语法,更安全也更清晰。
方案1:修复原有filter_写法
只需要在拼接字符串时给filter[i]加上单引号,让R识别它是字符串常量:
d <- data.frame(g = c("C","A")) library(dplyr) groups <- c("g") filter_vals <- c("C","A") # 把变量名改成filter_vals,避免和dplyr的filter函数重名,更规范 i <- 1 # 给字符值添加单引号,生成正确的过滤表达式 d %>% dplyr::filter_(paste0(groups[i], "=='", filter_vals[i], "'"))
运行这段代码就能得到你想要的、g列值为"C"的观测啦。
方案2:使用dplyr现代推荐语法(更推荐)
filter_是dplyr旧版本的函数,现在官方更推荐使用准引用或者across函数来实现动态过滤,不仅更清晰,还能避免字符串拼接的错误:
方法A:用准引用(sym + !!)
d %>% filter(!!sym(groups[i]) == filter_vals[i])
sym(groups[i])会把字符串"g"转换成变量符号!!用来“解引用”这个符号,让dplyr识别它是dataframe的列名
方法B:用across函数(适合扩展到多列过滤)
d %>% filter(across(all_of(groups[i]), ~.x == filter_vals[i]))
这种写法更灵活,如果之后你需要同时过滤多列,只需要修改groups向量即可。
内容的提问来源于stack exchange,提问作者user3022875
相关产品推荐
相关产品推荐

