使用str_detect过滤多列

时间:2019-04-02 15:51:30

标签: r

我正在使用tidyverse中的函数str_detect来过滤出与列表中任何字符串的开头相匹配的数据帧行。当前,在我的|语句中的每一列之间进行过滤时,利用filter语句。有没有办法在不使用or语句的情况下跨多个列使用str_detect?我目前在下面使用的代码有效,但无法扩展。


Dataframe <- data.frame("names" = c('John','Jill','Joe','Mark'), "Jobs" = c('Mailman','Jockey','Jobhunter',"Nojob"))

Filter_list <- c('Jo')

Dataframe %>% filter(str_detect(names, paste0("^(", paste(Filter_list, collapse = "|"), ")")) |
                     str_detect(Jobs, paste0("^(", paste(Filter_list, collapse = "|"), ")"))

  names      Jobs
1  John   Mailman
2  Jill    Jockey
3   Joe Jobhunter)

2 个答案:

答案 0 :(得分:3)

您可以使用filter_at

Dataframe %>% filter_at(.vars = vars(names, Jobs),
                    .vars_predicate = any_vars(str_detect(. , paste0("^(", paste(Filter_list, collapse = "|"), ")"))))

如果要将过滤器应用于所有变量,则可以使用filter_all

答案 1 :(得分:0)

我首先将其转换为长数据,然后使用str_detect()

DF <- Dataframe %>% mutate(ID = row_number())
Index <- DF %>% gather(key, value, -ID) %>% filter(str_detect(value, Filter_list))
DF %>% filter(ID %in% unique(Index$ID))