我正在使用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)
答案 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))