<div dir="ltr">Oi Walmes,<div><br></div><div>Obrigado por postar sua solução. Achei bem interessante.</div><div>Como disse tem um custo computacional alto, comparada a função fuzzyjoin::regex_left_join():</div><div>Apliquei ambas soluções em um conjunto de 583872 linhas:</div><div><br></div><div>################################################################################</div><div><pre tabindex="0" class="gmail-GGBOEFPDAWB" id="gmail-rstudio_console_output" style="font-family:"Ubuntu Mono",monospace;font-size:16px;outline:none;border:none;word-break:break-all;margin-top:0px;margin-bottom:0px;line-height:1.25;color:rgb(0,0,0);white-space:pre-wrap"><span tabindex="-1" style="outline:none"><span class="gmail-GGBOEFPDGVB gmail-ace_keyword" style="color:rgb(200,0,164)"></span></span></pre><pre tabindex="0" class="gmail-GGBOEFPDAWB" id="gmail-rstudio_console_output" style="font-family:"Ubuntu Mono",monospace;font-size:16px;outline:none;border:none;word-break:break-all;margin-top:0px;margin-bottom:0px;line-height:1.25;color:rgb(0,0,0);white-space:pre-wrap"><span tabindex="-1" style="outline:none"><span class="gmail-GGBOEFPDGVB gmail-ace_keyword" style="color:rgb(200,0,164)"></span></span></pre> system.time(<br> u <- sapply(patterns, FUN = grepl, x = df$nome)<br> ) +</div><div> system.time(<br> df$medicamento <-<br>     apply(u,<br>           MARGIN = 1,<br>           FUN = function(x) {<br>               # Tá sendo assumido que apenas 1 match ocorre.<br>               index <- head(which(x), n = 1)<br>               ifelse(length(index),<br>                      names(index),<br>                      NA_character_)<br>           })<br> )<br>  usuário   sistema decorrido <br>  275.638     0.649   276.237 <br>> system.time(<br> r <- fuzzyjoin::regex_left_join(df,<br>                                 Tabela_Antibiótico,<br>                                 by = "nome",<br>                                 ignore_case = TRUE)<br> )<br>  usuário   sistema decorrido <br>    2.579     0.000     2.578 <br>> dim(df)<br>[1] 583872     11<br></div><div><br></div><div><br></div><div><br></div><div>Após aplicar ambas soluções notei que ainda há um problema quando o nome do medicamento é composto.</div><div>Por exemplo, o Antibiótico de nome <b>PIPERACILINA-TAZOBACTAM</b> teve como resultado apenas o primeiro nome, veja a saída abaixo:</div><div><br></div><div><img src="cid:ii_kmaxmuv70" alt="image.png" width="562" height="89"><br></div><div><br></div><div>Tem alguma sugestão de como fazer o match quando o nome é composto?</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Em seg., 15 de mar. de 2021 às 11:00, Walmes Zeviani por (R-br) <<a href="mailto:r-br@listas.c3sl.ufpr.br">r-br@listas.c3sl.ufpr.br</a>> escreveu:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_default" style="font-family:"arial narrow",sans-serif;font-size:large">Você pode combinar sapply, grepl e apply.</div><div class="gmail_default" style="font-family:"arial narrow",sans-serif;font-size:large"><br></div><div class="gmail_default" style="font-family:"arial narrow",sans-serif;font-size:large"><span style="font-family:monospace"># Lista de medicamentos que guardei em um objeto chamado patterns.<br>patterns <- c("Oritavancina", "Oxacilina", "Pefloxacino", "Penicilina",<br>              "Pexiganan", "Piperacilina", "Piperacilina-tazobactam",<br>              "Pirazinamida", "Plazomicina", "Polimixina B",<br>              "Posilozid")<br><br># Amostra do Data frame em que preciso encontrar os nomes da lista acima.<br>df <- data.frame(nome =<br>                     c("CLORETO DE POTASSIO DRAGEA 600MG",<br>                       "CLORETO DE SODIO 0,9% SERINGA PREENCHIDA 5ML",<br>                       "CLORETO DE SODIO SOLUCAO INJETAVEL 0,9% 10ML",<br>                       "CODEINA FOSFATO SOLUCAO ORAL 3MGML 10ML ISCMPA @",<br>                       "CODEINA FOSFATO SOLUCAO ORAL 3MGML 5ML ISCMPA @",<br>                       "DipiRONA SOLUCAO INJETAVEL 500MGML 2ML",<br>                       "DipiRONA SOLUCAO INJETAVEL 500MGML 2ML",<br>                       "FUROSEMIDA SOLUCAO INJETAVEL 10MGML 2ML",<br>                       "HIDROCORTISONA SUCCINATO SODICO PO LIOFILO INJETAVEL 100MG",<br>                       "ONDANSETRONA CLORIDRATO SOLUCAO INJETAVEL 2MGML 4ML",<br>                       "ONDANSETRONA CLORIDRATO SOLUCAO INJETAVEL 2MGML 4ML",<br>                       "Penicilina G BENZATINA PO LIOFILO INJETAVEL 1200000UI",<br>                       "Penicilina G BENZATINA PO LIOFILO INJETAVEL 1200000UI",<br>                       "PIPERACILINA SODICA 4G + TAZOBACTAM SODICA 0,5G PO LIOFILO INJETAVEL"))<br><br>u <- sapply(patterns, FUN = grepl, x = df$nome)<br>df$medicamento <-<br>    apply(u,<br>          MARGIN = 1,<br>          FUN = function(x) {<br>              # Tá sendo assumido que apenas 1 match ocorre.<br>              index <- head(which(x), n = 1)<br>              ifelse(length(index),<br>                     names(index),<br>                     NA_character_)<br>          })</span><br></div><div class="gmail_default" style="font-family:"arial narrow",sans-serif;font-size:large"><br></div><div class="gmail_default" style="font-family:"arial narrow",sans-serif;font-size:large">Atenção!</div><div class="gmail_default" style="font-family:"arial narrow",sans-serif;font-size:large">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.</div><div class="gmail_default" style="font-family:"arial narrow",sans-serif;font-size:large"><br></div><div class="gmail_default" style="font-family:"arial narrow",sans-serif;font-size:large">Outra opção é verificar se não tem como usar um "inner join with approximate matching". Confere o que tem no {stringdist} e {fuzzyjoin}.</div><div class="gmail_default" style="font-family:"arial narrow",sans-serif;font-size:large"><br></div><div class="gmail_default" style="font-family:"arial narrow",sans-serif;font-size:large">À disposição.</div><div class="gmail_default" style="font-family:"arial narrow",sans-serif;font-size:large">Walmes.<br></div><br></div>
_______________________________________________<br>
R-br mailing list<br>
<a href="mailto:R-br@listas.c3sl.ufpr.br" target="_blank">R-br@listas.c3sl.ufpr.br</a><br>
<a href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br" rel="noreferrer" target="_blank">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a><br>
Leia o guia de postagem (<a href="http://www.leg.ufpr.br/r-br-guia" rel="noreferrer" target="_blank">http://www.leg.ufpr.br/r-br-guia</a>) e forneça código mínimo reproduzível.<br>
</blockquote></div>