Вам нужно экранировать специальные символы (с двойной обратной косой чертой \\
в R), иначе регулярное выражение выдаст ошибку.
В регулярном выражении +
означает совпадение символа один или несколько раз. Таким образом, pharmacy+
соответствует pharmac
, за которым следует одно или бесконечное число y
, что, вероятно, не нужно.
Я бы рекомендовал использовать \\s
вместо простого пробела. \\s
соответствует любому символу пробела [ \t\r\n\f]
и поэтому более универсален.
Вот как бы я это сделал.
viz <- data.frame(
med_2 = c(
"pharmacy - oxycodone/acetaminophen (3)",
"pharmacy - fentanyl (2.83)",
"pharmacy - hydromorphone (6.8)"
)
)
# list of the different drug names
drugs_ls <- c(
"codeine",
"oxycodone",
"fentanyl",
"hydrocodone",
"hydromophone",
"mathadone",
"morphine sulfate",
"oxycontin",
"roxicodone",
"tramadol",
"acetaminophen"
)
# concatenate and separate drug names with a pipe
drugs_re <- paste0(drugs_ls, collapse = "|")
# generate the regex
med_re <- paste0("^(?i)pharmacy[\\s-]+(?:", drugs_re, ")(?:\\/acetaminophen)?[\\s-]+\\(\\d")
viz$med_2 <- apply(viz, 1, function(x)as.integer(any(grep(med_re, x, perl = TRUE))))
viz
# med_2
#1 1
#2 1
#3 0
Все регулярное выражение выглядит так:
^(?i)pharmacy[\\s-]+(?:codeine|oxycodone|fentanyl|hydrocodone|hydromophone|mathadone|morphine sulfate|oxycontin|roxicodone|tramadol|acetaminophen)(?:\\/acetaminophen)?[\\s-]+\\(\\d
(?i)
делает регистр нечувствительным к регистру.
(?:)
создает группу без захвата.
?
соответствует персонажу / группе или ничему.
\\d
является сокращением для [0-9]
.