сокращение для использования str_detect и & в фильтре - PullRequest
2 голосов
/ 22 апреля 2020

Я пытаюсь получить короткую руку для использования str_detect и & до filter фрейма данных:

library(tidyverse)
df <- data.frame(type = c("age", "age and sex", "sex"))
#          type
# 1         age
# 2 age and sex
# 3         sex

Я хочу сократить эту трубу

df %>% 
  filter(str_detect(type, "age") & str_detect(type, "sex"))
#          type
# 1 age and sex 

Так что я бы хотел передать фильтр на map через pattern <- c("age", "sex") и, возможно, использовать reduce как-нибудь?

Спасибо

1 Ответ

2 голосов
/ 22 апреля 2020

Мы можем использовать регулярное выражение, чтобы указать ноль или более символов (*) после «возраста», следующего за «полом». \\b должен указать границу слова, чтобы она не соответствовала 'adage' и т. Д. c.

library(dplyr)
library(stringr)
df %>% 
   filter(str_detect(type, '\\bage\\b.*\\bsex'))

или использовать map/reduce

library(purrr)
df %>%
   filter(map(c('age', 'sex'), ~ str_detect(type, .x)) %>% reduce(`&`))
...