R dplyr: фильтровать данные по множеству выражений Regex, определенных вектором - PullRequest
1 голос
/ 18 июня 2019

У меня есть фрейм данных, из которого я хочу выбрать важные столбцы, а затем отфильтровать строки, содержащие конкретное окончание.

Выражение регулярного выражения упрощает определение моего конечного значения с помощью символа xx$. Но как изменить несколько возможных окончаний (xx$, yy$)?

Пустой пример:

require(dplyr)

x <- c("aa", "aa", "aa", "bb", "cc", "cc", "cc")
y <- c(101, 102, 113, 201, 202, 344, 407)
type = rep("zz", 7)
df = data.frame(x, y, type)    

# Select all expressions that starts end by "7"
df %>%
  select(x, y) %>%
  filter(grepl("7$", y))

# It seems working when I explicitly define my variables, but I need to use it as a vector instead of values?
df %>%
  select(x, y) %>%
  filter(grepl("[2|7]$", y))  # need to modify this using multiple endings


# How to modify this expression, to use vector of endings (ids) instead?
ids = c(7,2)     # define vector of my values

df %>%
     select(x, y) %>%
     filter(grepl("ids$", y))  # how to change "grepl(ids, y)??"

Ожидаемый результат:

   x   y type
1 aa 102   zz
2 cc 202   zz
3 cc 407   zz

Пример, основанный на этом вопросе: Регулярные выражения (RegEx) и dplyr :: filter ()

1 Ответ

1 голос
/ 20 июня 2019

Вы можете использовать

df %>% 
  select(x, y) %> filter(grepl(paste0("(?:", paste(ids, collapse="|"), ")$"), y))

Часть paste0("(?:", paste(ids, collapse="|"), ")$") создаст шаблон чередования, который будет соответствовать только в конце строки из-за привязки $ в конце.

ПРИМЕЧАНИЕ : если значения могут иметь специальные метасимволы регулярных выражений, вам нужно сначала экранировать значения в символьном векторе:

regex.escape <- function(string) {
  gsub("([][{}()+*^${|\\\\?])", "\\\\\\1", string)
}
df %>% 
      select(x, y) %> filter(grepl(paste0("(?:", paste(regex.escape(ids), collapse="|"), ")$"), y))
                                                       ^^^^^^^^^^^^^^^^^

Например, paste0("(?:", paste(c("7", "8", "ids"), collapse="|"), ")$") будет выводить (?:7|8|ids)$:

  • (?: - начало группы без захвата, которая будет действовать как контейнер для альтернатив, так что якорь $ применяется ко всем из них, а недо последнего, соответствующего любому из
    • 7 - 7 char
  • | - или
  • 8 - 8 char
  • | - или
  • ids - ids подстрока
  • ) - конецгруппа
  • $ - конец строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...