Поиск шаблона специальных символов с помощью str_detect - PullRequest
1 голос
/ 08 февраля 2020

Предположим, у меня есть следующее значение df:

library(dplyr)
library(stringr)

input <- data.frame(
Id = c(1:6),
text = c("(714.4) (714) (714*)", "(714.33)", "(189) (1938.23)", "(714.93+) (714*)", "(719)", "(718.4)"))

И я хотел бы получить следующий вывод:

Output <- data.frame(
Id = c(1:6),
text = c("(714.4) (714) (714*)", "(714.33)", "(189) (1938.23)",
 "(714.93+) (714*)", "(719) (299)", "(718.4)"),
first_match = c(1,0,0,0,1,0),
second_match = c(1,1,0,1,1,0))

Это для первого столбца, я хочу один, если (714) | (719) | (718) появляются. Для второго столбца я хочу один, если (714.33) | (714 *) | (719) появляются

В тех случаях, когда я хочу оценить, находится ли образец в строке, я использую str_detect функция из пакета stringr . Однако в этом случае с такими символами, как [. + *] Я не получаю ожидаемый вывод.

Я пробовал следующий код, который явно не удался:

attempt_1 <- input %>%
  mutate(first_match = ifelse(str_detect(text, "(714)|(719)|(718)"), 1, 0), 
         second_match = ifelse(str_detect(text, "(714\\.33)|(714\\*)|(719)"), 1, 0))

attempt_2 <- input %>%
 mutate(first_match = ifelse(str_detect(text, fixed("(714)|(719)")), 1, 0), 
        second_match = ifelse(str_detect(text, "(714\\.33)|(714\\*)"), 1, 0))

Я пытался экранировать специальные символы, а также пытался с точным совпадением с фиксированный параметр (я полагаю, он не работает, потому что | не интерпретируется как ИЛИ)

Есть идеи?

1 Ответ

2 голосов
/ 08 февраля 2020

Мы можем избежать (

library(dplyr)
library(stringr)
input %>%
    mutate(first_match = +(str_detect(text, "\\(714\\)|\\(719\\)")),
        second_match = +(str_detect(text, "\\(714\\.33\\)|\\(714\\*\\)|\\(719\\)")))
#   Id                 text first_match second_match
#1  1 (714.4) (714) (714*)           1            1
#2  2             (714.33)           0            1
#3  3      (189) (1938.23)           0            0
#4  4     (714.93+) (714*)           0            1
#5  5                (719)           1            1
#6  6              (718.4)           0            0

Сравнение с ожидаемым выводом OP

Output
#  Id                 text first_match second_match
#1  1 (714.4) (714) (714*)           1            1
#2  2             (714.33)           0            1
#3  3      (189) (1938.23)           0            0
#4  4     (714.93+) (714*)           0            1
#5  5          (719) (299)           1            1
#6  6              (718.4)           0            0

В коде OP первый не работал, потому что ( является метасимволом, и во второй попытке | считается фиксированным

...