[R-br] Identificando e criando nova variável por uma expressão regular

Walmes Zeviani walmeszeviani em gmail.com
Seg Mar 15 10:59:56 -03 2021


Você pode combinar sapply, grepl e apply.

# Lista de medicamentos que guardei em um objeto chamado patterns.
patterns <- c("Oritavancina", "Oxacilina", "Pefloxacino", "Penicilina",
              "Pexiganan", "Piperacilina", "Piperacilina-tazobactam",
              "Pirazinamida", "Plazomicina", "Polimixina B",
              "Posilozid")

# Amostra do Data frame em que preciso encontrar os nomes da lista acima.
df <- data.frame(nome =
                     c("CLORETO DE POTASSIO DRAGEA 600MG",
                       "CLORETO DE SODIO 0,9% SERINGA PREENCHIDA 5ML",
                       "CLORETO DE SODIO SOLUCAO INJETAVEL 0,9% 10ML",
                       "CODEINA FOSFATO SOLUCAO ORAL 3MGML 10ML ISCMPA @",
                       "CODEINA FOSFATO SOLUCAO ORAL 3MGML 5ML ISCMPA @",
                       "DipiRONA SOLUCAO INJETAVEL 500MGML 2ML",
                       "DipiRONA SOLUCAO INJETAVEL 500MGML 2ML",
                       "FUROSEMIDA SOLUCAO INJETAVEL 10MGML 2ML",
                       "HIDROCORTISONA SUCCINATO SODICO PO LIOFILO
INJETAVEL 100MG",
                       "ONDANSETRONA CLORIDRATO SOLUCAO INJETAVEL 2MGML
4ML",
                       "ONDANSETRONA CLORIDRATO SOLUCAO INJETAVEL 2MGML
4ML",
                       "Penicilina G BENZATINA PO LIOFILO INJETAVEL
1200000UI",
                       "Penicilina G BENZATINA PO LIOFILO INJETAVEL
1200000UI",
                       "PIPERACILINA SODICA 4G + TAZOBACTAM SODICA 0,5G PO
LIOFILO INJETAVEL"))

u <- sapply(patterns, FUN = grepl, x = df$nome)
df$medicamento <-
    apply(u,
          MARGIN = 1,
          FUN = function(x) {
              # Tá sendo assumido que apenas 1 match ocorre.
              index <- head(which(x), n = 1)
              ifelse(length(index),
                     names(index),
                     NA_character_)
          })

Atenção!
Se você tiver que fazer isso para muitos itens e muitos medicamentos onde
no máximo um match é esperado, esse código tá caro porque ele avalia o
match de cada produto (p produtos) com cada item (n itens) e retorna uma
matriz n * p de valores lógicos. Você pode escrever a instrução de forma
condicional: quando encontrar o primeiro match, passar para o próximo item.
Vai ter que fazer um benchmark porque as instruções vetorizadas são rápidas
e colocar condicionais em loops é um pouco lento. Tudo vai depender do p e
n do seu problema.

Outra opção é verificar se não tem como usar um "inner join with
approximate matching". Confere o que tem no {stringdist} e {fuzzyjoin}.

À disposição.
Walmes.
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20210315/1cc94ace/attachment.html>


Mais detalhes sobre a lista de discussão R-br