#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