使用dplyr::filter筛选tibble行报错:No tidyselect variables were registered
解决dplyr::filter()中使用contains()报错的问题
这个报错我之前也碰到过,核心原因是你搞混了contains()的适用场景——它是tidyselect系列工具,专门用来匹配列名(比如在select()里挑选列),但filter()是用来筛选行的,需要的是基于列值的逻辑判断,自然会报错啦。
给你两种符合tidyverse风格的正确写法:
方法1:用stringr包的str_starts()(最推荐)
tidyverse生态里的stringr包专门处理字符串操作,str_starts()就是专门判断字符串是否以指定内容开头的函数,完美适配filter()的需求:
library(tidyverse) # 或者单独加载dplyr和stringr raw.tb %>% dplyr::filter(stringr::str_starts(ind, "A"))
这个代码会检查ind列的每一个值,只保留以"A"开头的行,完全符合你的需求。
方法2:用正则表达式+base R的grepl()(兼容tidyverse管道)
如果你不想额外加载stringr,也可以用正则表达式的^符号(表示字符串开头)结合grepl(),同样能在tidyverse管道里运行:
raw.tb %>% dplyr::filter(grepl("^A", ind))
再补一句小提醒:以后要区分开哦——tidyselect的函数(比如contains()、starts_with())是给select()、rename()这类操作列名的函数用的;而筛选行的filter()需要的是返回逻辑向量的条件,用字符串处理函数或者逻辑判断就对啦。
内容的提问来源于stack exchange,提问作者Al3xEP
相关产品推荐
相关产品推荐

