<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>