Фильтруйте строки, содержащие только некоторые буквы в R

#r #string #dplyr #tidyverse

Вопрос:

Я хочу отфильтровать строки фрейма данных (содержащие слова), чтобы сохранить только те слова, которые состоят из некоторых букв. Например, предположим, что у меня есть фрейм данных, такой как:

 library(tidyverse)  df lt;- data.frame(words = c("acerbe", "malus", "as", "clade", "after", "sel", "moineau") )   words 1 acerbe 2 malus 3 as 4 clade 5 after 6 sel 7 moineau  

Я хочу сохранить только строки (слова), состоящие из следующих букв (и только их):

 letters lt;- c("a", "z", "e", "r", "q", "s", "d", "f", "w", "x", "c")  

Другими словами, я хочу исключить слова, содержащие другие буквы, чем перечисленные выше.

Я пытался использовать string::str_detect(), но пока безуспешно…

 letters lt;- "a|z|e|r|q|s|d|f|w|x|c"  df lt;- data.frame(words = c("acerbe", "malus", "as", "clade", "after", "sel", "moineau") ) df %gt;% filter(str_detect(string = words, pattern = letters, negate = FALSE) )   words 1 acerbe 2 malus 3 as 4 clade 5 after 6 sel 7 moineau  

Ответ №1:

Я бы использовал grepl здесь подход:

 letters lt;- c("a", "z", "e", "r", "q", "s", "d", "f", "w", "x", "c") regex lt;- paste0("^[", paste(letters, collapse=""), "] $") df$words[grepl(regex, df$words)]  [1] "as"  

Обратите внимание, что шаблон регулярного выражения, используемый здесь, grepl является:

 ^[azerqsdfwxc] $  

Единственное слово, которое содержит только эти буквы в вашем фрейме входных данных, оказывается as .

Ответ №2:

Подход dplyr:

 df %gt;%  rowwise() %gt;%  filter(sum(str_count(words, letters))==nchar(words))   # A tibble: 1 x 1 # Rowwise:   words  lt;chrgt; 1 as