ПЧ фильтр для регулярных выражений R - PullRequest
0 голосов
/ 15 мая 2018

Я хотел бы создать флаг во фрейме данных (или таблице данных) на основе соответствия строки некоторым терминам в R.

df = data.frame(text = c("AABA","AACA","AAAA","BAAE","CAAD","CCCC","DDDD","EEEE"))
df$flag[stri_detect_regex(df$text,"AAB|AAC|AAA|BAA|CAA")] = 'Match1'

Показывать вывод следующим образом:

    text    flag
1   AABA    Match1
2   AACA    Match1
3   AAAA    Match1
4   BAAE    Match1
5   CAAD    Match1
6   CCCC    <NA>
7   DDDD    <NA>
8   EEEE    <NA>

Затем я хочу проверить другой шаблон:

df$flag[stri_detect_regex(df$text,"CCCC|DDDD")] = 'Match2'

Но запускайте его, только если flag равен NA, т.е. is.na (df $ flag).Также было бы здорово узнать, как я могу включить несколько условий, например:

is.na(df$flag) & df$other_var == 1 

. Причина, по которой я хочу это сделать, заключается в том, что мне нужно просмотреть много миллионов строк и выполнить регулярное выражение только для строккоторые либо не имеют флага, и / или включают другие критерии фильтрации.Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Вы можете использовать именованные группы захвата и извлечь имя

df <- data.frame(text = c("AABA","AACA","AAAA","BAAE","CAAD","CCCC","DDDD","EEEE"))

capture_name <- function(x) {
  x <- attr(x, 'capture.start')
  ifelse(sum(x) == 0, NA, colnames(x)[x > 0])
}

p <- c(Match1 = 'AAB|AAC|AAA|BAA|CAA',
       Match2 = 'CCCC|DDDD')
p <- paste(sprintf('(?<%s>%s)', names(p), p), collapse = '|')

within(df, {
  flag <- sapply(gregexpr(p, df$text, perl = TRUE), capture_name)
})

#   text   flag
# 1 AABA Match1
# 2 AACA Match1
# 3 AAAA Match1
# 4 BAAE Match1
# 5 CAAD Match1
# 6 CCCC Match2
# 7 DDDD Match2
# 8 EEEE   <NA>
0 голосов
/ 15 мая 2018

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

library(dplyr)
library(stringi)
df %>%
   mutate(flag = case_when(stri_detect_regex(text, "AAB|AAC|AAA|BAA|CAA") ~ "Match1",
                           stri_detect_regex(text, "CCCC|DDDD") ~ "Match2"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...