Как использовать str_which для выбора строк, которые содержат строку из вектора - PullRequest
0 голосов
/ 18 января 2019

У меня есть такая таблица

name    <- c("Goku","Vegeta","Jiren","Gohan","Piccolo","Kurinin","Trunks","Buu","Frieza","Cell","Muten","Gotens")
surname <- c("San","San","San","San","San","San","San","Majin","Evil","San","Roshi","San")
email   <- c("goku@gmail.com","vegeta@gmail.com","jiren@patrol.ch","gohan@gmail.com","piccolo@gmail.com","kurinin@gmail.com","Trunks@gmail.com","buu@babidi.com","frieza@rampage.usa","cell@rampage.usa","muten@gmail.com","gotens@gmail.com")

table <- data.frame(name, surname, email, stringsAsFactors = FALSE)

И у меня есть Вектор с разными окончаниями в адресах электронной почты. Я хочу найти все строки, которые используют адреса электронной почты с этими окончаниями

searchvector = c("@patrol.ch", "@babidi.com", "@rampage.usa")
searchvector = as.character(searchvector)

Существует два способа поиска строк, связанных с вектором поиска:

A. Использование str_detect:

table[str_detect(table$email, "@patrol.ch|@babidi.com|@rampage.usa"), ]

Это дает мне правильный результат

name surname              email  
3   Jiren     San    jiren@patrol.ch  
8     Buu   Majin     buu@babidi.com  
9  Frieza    Evil frieza@rampage.usa  
10   Cell     San   cell@rampage.usa 

B. Но при использовании str_which я всегда получаю только две строки

table[str_which(table$email, searchvector), ]
table[str_which(table$email, c("@patrol.ch", "@babidi.com", "@rampage.usa")), ]

Я получаю этот результат в обоих случаях:

name surname email  
8 Buu Majin buu@babidi.com
9 Frieza Evil frieza@rampage.usa

Почему это? И как я могу использовать str_which, чтобы делать то, что я хочу достичь?

1 Ответ

0 голосов
/ 18 января 2019

Согласно ?str_which, это функция оболочки

str_which () - это оболочка, вокруг которой (str_detect (x, pattern)), и эквивалентная grep (pattern, x).

Чтобы получить тот же вывод, нам нужна одна строка в pattern. Его можно создать с помощью paste и указать аргумент collapse для |

table[str_which(table$email, paste(searchvector, collapse="|")), ]
#     name surname              email
#3   Jiren     San    jiren@patrol.ch
#8     Buu   Majin     buu@babidi.com
#9  Frieza    Evil frieza@rampage.usa
#10   Cell     San   cell@rampage.usa

так же, как он был создан для str_detect в посте ОП

Если мы используем вектор как pattern в str_detect

table[str_detect(table$email, searchvector),]
#   name surname              email
#8    Buu   Majin     buu@babidi.com
#9 Frieza    Evil frieza@rampage.usa

возвращает тот же вывод, что и в str_which с кодом OP

Относительно проблемы vectorization с str_detect это так, но здесь length для 'email' и 'searchvector' отличается. Итак, возникнет проблема утилизации

...