R语言如何筛选任意列包含指定字符串的行
错误原因
你原有代码的筛选逻辑是**所有字符列都包含字符串blue**才会保留对应行,和你需要的「任意一个字符列包含blue就保留行」的需求不符。dplyr从1.0.4版本开始提供if_any()和if_all()函数,分别用来处理跨列的「任意满足」和「全部满足」的逻辑判断。
调整后的正确代码
library(tidyverse) library(lubridate) tibble::tribble( ~date, ~col_1, ~col_2, ~col_3, "11/10/2021", "blue", "jhf", "fff", "12/10/2021", "ert", "blue", "kkk", "13/10/2021", "yui", "yui", "blkeee" ) %>% mutate(date = lubridate::dmy(date)) %>% dplyr::filter(if_any( .cols = where(is.character), .fns = ~str_detect(., regex("blue", ignore_case = TRUE)) ))
低版本dplyr兼容写法
如果你使用的dplyr版本低于1.0.4没有提供if_any函数,可以用rowSums实现相同逻辑:
tibble::tribble( ~date, ~col_1, ~col_2, ~col_3, "11/10/2021", "blue", "jhf", "fff", "12/10/2021", "ert", "blue", "kkk", "13/10/2021", "yui", "yui", "blkeee" ) %>% mutate(date = lubridate::dmy(date)) %>% dplyr::filter(rowSums(across(where(is.character), ~str_detect(., regex("blue", ignore_case = TRUE)))) > 0)
运行上述任意一段代码,都会正确返回10月11日、10月12日对应的两行目标数据。
内容的提问来源于stack exchange,提问作者cephalopod
相关产品推荐
相关产品推荐

