[R-br] Dúvida lógica do código R.

Cesar Rabak cesar.rabak em gmail.com
Seg Fev 14 17:21:52 -03 2022


Diogo,

Como vc já resolveu o prob principal, faço apenas uma sugestãozinha:

Este código parece-me estar *pedindo* para ser otimizado pelo uso da função
rowMeans().

for (i in (1:nrow(dados))){
dados$Média[i]<-mean(dados$v1[i],dados$v2[i],dados$v3[i],dados$v4[i],dados$v5[i],na.rm
= TRUE)
}

Não testei, mas ficaria desta forma no seu exemplo:

dados$Média <- rowMeans(dados, na.rm=TRUE)

HTH
--
Cesar Rabak


On Mon, Feb 14, 2022 at 2:26 PM Diogo Jerônimo por (R-br) <
r-br em listas.c3sl.ufpr.br> wrote:

> Prezado professor Marcus, obrigado!!!
>
> *Diogo Jerônimo*
> *Bacharel em Ciências Estatísticas - ENCE/IBGE*
> *Mestre em Metrologia - PUC-Rio/PósMQI*
> *http://lattes.cnpq.br/8996149312896520
> <http://lattes.cnpq.br/8996149312896520>*
>
> Em segunda-feira, 14 de fevereiro de 2022 14:12:13 BRT, Marcus Nunes <
> marcus.nunes em gmail.com> escreveu:
>
>
> O código a seguir tem comentários sobre o que está incorreto. Ao final, eu
> posto o código que funciona.
>
> # Código antigo
>
>   i=1 # o laço `for` atualiza automaticamente o contador `i`, criando cada
> um dos seus valores. portanto, essa linha é redundante.
> for (i in (1:nrow(dados))){ # o ideal é fazer `i` variar até
> `nrow(dados)-1`, pois `i+1`quando `i=10` extrapola o tamanho do data frame
>   if ((dados$Cluster[i]==dados$Cluster[i+1]) &
> (dados$Média[i]==dados$Média[i+1])){
>     dados$sit[i] == "Resultado Igual"
>     dados$sit[i+1] == "Resultado Igual"} # em nenhum local se define onde
> entra o "Resultado Diferente"
>   else { # desnecessário
>   }
>   i=i+1 # linha redundante
> }
>
> # Código que funciona
>
> dados$sit <- "Resultado Diferente" # inicializa a coluna `sit` inteira
> como `Resultado Diferente`
>
> for (i in (1:(nrow(dados)-1))){
>   if ((dados$Cluster[i]==dados$Cluster[i+1]) &
> (dados$Média[i]==dados$Média[i+1])){
>     dados$sit[i] <- "Resultado Igual" # substitui apenas as posições de
> `sit` nas quais há resultado igual, de acordo com a condicional acima
>     dados$sit[i+1] <- "Resultado Igual"
>     }
> }
>
> Não cheguei a testar minha sugestão em casos com 3 ou mais laboratórios
> iguais, então não saberia te dizer se a minha solução é universal.
> --
> Marcus Nunes
> Professor Adjunto
> https://marcusnunes.me/
> Universidade Federal do Rio Grande do Norte
> Departamento de Estatística
> Laboratório de Estatística Aplicada - http://lea.estatistica.ccet.ufrn.br
> Curso de Big Data - https://introbigdata.org
> Aplicações em Shiny - http://shiny.estatistica.ccet.ufrn.br
>
>
> On Mon, Feb 14, 2022 at 1:50 PM Diogo Jerônimo por (R-br) <
> r-br em listas.c3sl.ufpr.br> wrote:
>
> Boa tarde a todos!!! Dúvida boba, mas tenho de explicar antes: estou
> fazendo uma análise de cluster, para poder identificar resultados iguais de
> laboratórios analíticos. O resultado foi um banco parecido com esse
> reproduzível:
>
> library(dplyr)
>
> x01<-c(8.49,8.62,8.63,8.49,8.44,2)
> x02<-c(9.18,9.21,9.15,8.86,9.36,3)
> x03<-c(8.49,8.62,8.63,8.49,8.44,2)
> x04<-c(9.74,9.69,9.81,9.25,9.98,3)
> x05<-c(9.74,9.69,9.81,9.25,9.98,3)
> x06<-c(8.15,9.52,9.89,9.95,8.33,2)
> x07<-c(8.32,8.73,9.60,9.04,9.97,3)
> x08<-c(7.42,7.01,7.31,7.20,7.61,1)
> x09<-c(9.79,8.76,9.68,8.31,9.37,3)
> x10<-c(7.42,7.01,7.31,7.20,7.61,1)
>
> dados<-data.frame(rbind(x01,x02,x03,x04,x05,x06,x07,x08,x09,x10))
> names(dados)<-c("v1","v2","v3","v4","v5","Cluster")
>
> Para facilitar essa identificação, ordenei os resultados por cluster,
> pelos dados das variáveis, e então calculei a média em cada linha:
>
> dados<-dados %>%
> arrange(Cluster, v1,v2,v3,v4,v5)
>
> for (i in (1:nrow(dados))){
> dados$Média[i]<-mean(dados$v1[i],dados$v2[i],dados$v3[i],dados$v4[i],dados$v5[i],na.rm
> = TRUE)
> }
>
> *MEU PROBLEMA:* para finalmente identificar os resultados iguais, eu
> apliquei esse código abaixo, onde em resumo, se o cluster for igual e a
> média do resultado do laboratório da *linha i* for igual a média do
> resultado do laboratório da *linha i+1*, então ambos os laboratórios
> responderam resultados iguais. Apliquei o código abaixo, e ele está
> resultando em erro:
>
> i=1
> for (i in (1:nrow(dados))){
> if ((dados$Cluster[i]==dados$Cluster[i+1]) &
> (dados$Média[i]==dados$Média[i+1])){
> dados$sit[i] == "Resultado Igual"
> dados$sit[i+1] == "Resultado Igual"}
> else {
> }
> i=i+1
> }
>
> Alguém poderia dizer qual o meu erro? Ou se faltou algo no código?
>
> Muito agradecido pela atenção, e desculpa a extensão!!!
>
> *Diogo Jerônimo*
> *Bacharel em Ciências Estatísticas - ENCE/IBGE*
> *Mestre em Metrologia - PUC-Rio/PósMQI*
> *http://lattes.cnpq.br/8996149312896520
> <http://lattes.cnpq.br/8996149312896520>*
>
>
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
> código mínimo reproduzível.
>
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
> código mínimo reproduzível.
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20220214/7e28ea7c/attachment.htm>


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