Re: [R-br] arredondar soma para 100%

Se você arredondar o seu objeto "porc" para 3 digitos, terás 20,455 para a letra a. Não sei porque cargas d'água o R arredonda para 20,45, pois aprendi na escolinha e segundo o wikipedia também, o correto seria arredondar este número para 20,46. Fazendo isso, o seu problema fica resolvido. (S,f,P) Allaman \begin{signature} <<>>= Prof. Dr. Ivan Bezerra Allaman Universidade Estadual de Santa Cruz Departamento de Ciências Exatas e Tecnológicas Ilhéus/BA - Brasil Fone: +55 73 3680-5076 E-mail: ivanalaman@yahoo.com.br/ivanalaman@gmail.com @ \end{signature}

Alex, o que vc esta' observado e' a acumulacao de erros de representacao, devido ao arredondamento. Uma forma de corrigir isso eh normalizar as proporcoes. Usando os dados aos quais voce referiu-se acima: pNaive = round(prop.table(tabela), digits=3) pFix = round(pNaive/sum(pNaive)*100, digits=1) Entretanto, note que essa solucao (como representada acima) pode nao ser geral e exigir algumas repeticoes (afinal, a todo momento voce esta' tentando representar numeros com trocentas casas decimais num grau de granularidade bem maior). Ivan, sobre a representacao de 9/44... Eh 0.20454545... (periodica no 45). Ou, usando a escala acima: 20.4545454545.... Arredondar para a i-esima casa decimal (pelo menos conforme eu aprendi, que eh concordante com a implementacao do R) consiste em truncar na casa (i+1), testar se aquele digito e' maior ou igual a 5 e, se sim, incrementar a casa i em 1 unidade. Dito isso: - Arredondar para 1 digito: Segundo digito eh 5, entao incrementa o primeiro: 20.5 - Arredondar para 2 digitos: Terceiro digito eh 4, entao mantem o segundo: 20.45 - Arredondar para 3 digitos: Quarto digito eh 5, entao incrementa o terceiro: 20.455 Pode ser que a estrategia a qual voce esteja se referindo seja diferente? b

Essa história de arredondamento lembra uma velha prática de orçamentos em licitação nos anos 80 e 90. Nesta época, computadores engatinhavam e era praxe ter que apresentar orçamentos tendo que fechar 'na fita' da máquina de calcular. Nesta época eu mexia com programação... sofri muito tendo que fazer rotinas para propagar erros de arredondamento como se fossem as velhas máquinas de calcular Quando formei em Estatística, peguei situação semelhante na SEE, onde cada gráfico ou tabela, tinha que deslocar um estagiário para fazer os totais fecharem com as somas. O tempo passa e os problemas continuam os mesmos... []s Leonard de Assis assis <dot> leonard <at> gmail <dot> com Em 27/01/2012 10:04, Benilton Carvalho escreveu:
Alex, o que vc esta' observado e' a acumulacao de erros de representacao, devido ao arredondamento. Uma forma de corrigir isso eh normalizar as proporcoes. Usando os dados aos quais voce referiu-se acima:
pNaive = round(prop.table(tabela), digits=3) pFix = round(pNaive/sum(pNaive)*100, digits=1)
Entretanto, note que essa solucao (como representada acima) pode nao ser geral e exigir algumas repeticoes (afinal, a todo momento voce esta' tentando representar numeros com trocentas casas decimais num grau de granularidade bem maior).
Ivan, sobre a representacao de 9/44... Eh 0.20454545... (periodica no 45). Ou, usando a escala acima: 20.4545454545.... Arredondar para a i-esima casa decimal (pelo menos conforme eu aprendi, que eh concordante com a implementacao do R) consiste em truncar na casa (i+1), testar se aquele digito e' maior ou igual a 5 e, se sim, incrementar a casa i em 1 unidade. Dito isso:
- Arredondar para 1 digito: Segundo digito eh 5, entao incrementa o primeiro: 20.5 - Arredondar para 2 digitos: Terceiro digito eh 4, entao mantem o segundo: 20.45 - Arredondar para 3 digitos: Quarto digito eh 5, entao incrementa o terceiro: 20.455
Pode ser que a estrategia a qual voce esteja se referindo seja diferente?
b _______________________________________________ R-br mailing list R-br@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.

Obrigado Ivan pelas considerações. Benilton, sua solução para este caso ficou perfeita ! Então Leonard, no meu caso sempre tenho que fazer esses arredondamentos, pois são muitos os causos cujas somas dão 99,9% ou 100,1% Felicidades! Alex
________________________________ De: Benilton Carvalho <beniltoncarvalho@gmail.com> Para: r-br@listas.c3sl.ufpr.br; Ivan Bezerra Allaman <ivanalaman@yahoo.com.br> Enviadas: Sexta-feira, 27 de Janeiro de 2012 10:04 Assunto: Re: [R-br] arredondar soma para 100%
Alex, o que vc esta' observado e' a acumulacao de erros de representacao, devido ao arredondamento. Uma forma de corrigir isso eh normalizar as proporcoes. Usando os dados aos quais voce referiu-se acima:
pNaive = round(prop.table(tabela), digits=3) pFix = round(pNaive/sum(pNaive)*100, digits=1)
Entretanto, note que essa solucao (como representada acima) pode nao ser geral e exigir algumas repeticoes (afinal, a todo momento voce esta' tentando representar numeros com trocentas casas decimais num grau de granularidade bem maior).
Ivan, sobre a representacao de 9/44... Eh 0.20454545... (periodica no 45). Ou, usando a escala acima: 20.4545454545.... Arredondar para a i-esima casa decimal (pelo menos conforme eu aprendi, que eh concordante com a implementacao do R) consiste em truncar na casa (i+1), testar se aquele digito e' maior ou igual a 5 e, se sim, incrementar a casa i em 1 unidade. Dito isso:
- Arredondar para 1 digito: Segundo digito eh 5, entao incrementa o primeiro: 20.5 - Arredondar para 2 digitos: Terceiro digito eh 4, entao mantem o segundo: 20.45 - Arredondar para 3 digitos: Quarto digito eh 5, entao incrementa o terceiro: 20.455
Pode ser que a estrategia a qual voce esteja se referindo seja diferente?
b _______________________________________________ R-br mailing list R-br@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.

Rodei estes comandos com os anteriores e não vi diferença! a=rep("a",9);b=rep("b",30);c=rep("c",5) dados=c(a,b,c);tabela=table(dados) #porc=round(table(dados)/length(dados)*100,digits=1) pNaive = round(prop.table(tabela), digits=3) pFix = round(pNaive/sum(pNaive)*100, digits=1) graf=barplot(tabela,axes=FALSE,ylim=c(0,100));text(graf,porc,format(porc),pos=1);text(graf,porc," %",pos=1);text(graf,porc,format(tabela)) title(main = "Quantidade e Porcentagem das Categorias :a,b,c") Alex, o que vc esta' observado e' a acumulacao de erros de representacao, devido ao arredondamento. Uma forma de corrigir isso eh normalizar as proporcoes. Usando os dados aos quais voce referiu-se acima: pNaive = round(prop.table(tabela), digits=3) pFix = round(pNaive/sum(pNaive)*100, digits=1) Entretanto, note que essa solucao (como representada acima) pode nao ser geral e exigir algumas repeticoes (afinal, a todo momento voce esta' tentando representar numeros com trocentas casas decimais num grau de granularidade bem maior). Ivan, sobre a representacao de 9/44... Eh 0.20454545... (periodica no 45). Ou, usando a escala acima: 20.4545454545.... Arredondar para a i-esima casa decimal (pelo menos conforme eu aprendi, que eh concordante com a implementacao do R) consiste em truncar na casa (i+1), testar se aquele digito e' maior ou igual a 5 e, se sim, incrementar a casa i em 1 unidade. Dito isso: - Arredondar para 1 digito: Segundo digito eh 5, entao incrementa o primeiro: 20.5 - Arredondar para 2 digitos: Terceiro digito eh 4, entao mantem o segundo: 20.45 - Arredondar para 3 digitos: Quarto digito eh 5, entao incrementa o terceiro: 20.455 Pode ser que a estrategia a qual voce esteja se referindo seja diferente? b .

Mauro, usando o comando graf=barplot(tabela,axes=FALSE,ylim=c(0,100));text(graf,porc,format(porc),pos=1);text(graf,porc," %",pos=1);text(graf,porc,format(tabela)) a soma era 100,1% depois com a grande ajuda do Benilton, substituindo porc por pFix graf=barplot(tabela,axes=FALSE,ylim=c(0,100));text(graf,pFix,format(pFix),pos=1);text(graf,pFix," %",pos=1);text(graf,pFix,format(tabela)) a soma ficou 100% > perfeito ! A lástima é que não vale para todo caso ! Daí tem que se fazer o que o Leonard disse: cada gráfico ou tabela, deve deslocar alguém para fazer os totais fecharem com as somas. Boa semana! Respeitosamente, Alex
________________________________ De: Mauro Sznelwar <sznelwar@uol.com.br> Para: r-br@listas.c3sl.ufpr.br; Ivan Bezerra Allaman <ivanalaman@yahoo.com.br> Enviadas: Domingo, 29 de Janeiro de 2012 13:31 Assunto: Re: [R-br] arredondar soma para 100%
Rodei estes comandos com os anteriores e não vi diferença! a=rep("a",9);b=rep("b",30);c=rep("c",5) dados=c(a,b,c);tabela=table(dados) #porc=round(table(dados)/length(dados)*100,digits=1) pNaive = round(prop.table(tabela), digits=3) pFix = round(pNaive/sum(pNaive)*100, digits=1) graf=barplot(tabela,axes=FALSE,ylim=c(0,100));text(graf,porc,format(porc),pos=1);text(graf,porc," %",pos=1);text(graf,porc,format(tabela)) title(main = "Quantidade e Porcentagem das Categorias :a,b,c")
Alex, o que vc esta' observado e' a acumulacao de erros de representacao, devido ao arredondamento. Uma forma de corrigir isso eh normalizar as proporcoes. Usando os dados aos quais voce referiu-se acima:
pNaive = round(prop.table(tabela), digits=3) pFix = round(pNaive/sum(pNaive)*100, digits=1)
Entretanto, note que essa solucao (como representada acima) pode nao ser geral e exigir algumas repeticoes (afinal, a todo momento voce esta' tentando representar numeros com trocentas casas decimais num grau de granularidade bem maior).
Ivan, sobre a representacao de 9/44... Eh 0.20454545... (periodica no 45). Ou, usando a escala acima: 20.4545454545.... Arredondar para a i-esima casa decimal (pelo menos conforme eu aprendi, que eh concordante com a implementacao do R) consiste em truncar na casa (i+1), testar se aquele digito e' maior ou igual a 5 e, se sim, incrementar a casa i em 1 unidade. Dito isso:
- Arredondar para 1 digito: Segundo digito eh 5, entao incrementa o primeiro: 20.5 - Arredondar para 2 digitos: Terceiro digito eh 4, entao mantem o segundo: 20.45 - Arredondar para 3 digitos: Quarto digito eh 5, entao incrementa o terceiro: 20.455
Pode ser que a estrategia a qual voce esteja se referindo seja diferente?
b . _______________________________________________ R-br mailing list R-br@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.

Alexandre, Tente assim diff(c(0, round(cumsum(p), 3))) * 100 2012/1/29 Alexandro (Yahoo) <vl.alexandro@yahoo.com.br>
Mauro, usando o comando graf=barplot(tabela,axes=FALSE,ylim=c(0,100));text(graf,porc,format(porc),pos=1);text(graf,porc," %",pos=1);text(graf,porc,format(tabela)) a soma era 100,1%
depois com a grande ajuda do Benilton, substituindo porc por pFix graf=barplot(tabela,axes=FALSE,ylim=c(0,100));text(graf,pFix,format(pFix),pos=1);text(graf,pFix," %",pos=1);text(graf,pFix,format(tabela)) a soma ficou 100% > perfeito ! A lástima é que não vale para todo caso ! Daí tem que se fazer o que o Leonard disse: cada gráfico ou tabela, deve deslocar alguém para fazer os
totais fecharem com as somas.
Boa semana! Respeitosamente, Alex
------------------------------ *De:* Mauro Sznelwar <sznelwar@uol.com.br>
*Para:* r-br@listas.c3sl.ufpr.br; Ivan Bezerra Allaman < ivanalaman@yahoo.com.br> *Enviadas:* Domingo, 29 de Janeiro de 2012 13:31
*Assunto:* Re: [R-br] arredondar soma para 100%
Rodei estes comandos com os anteriores e não vi diferença! a=rep("a",9);b=rep("b",30);c=rep("c",5) dados=c(a,b,c);tabela=table(dados) #porc=round(table(dados)/length(dados)*100,digits=1) pNaive = round(prop.table(tabela), digits=3) pFix = round(pNaive/sum(pNaive)*100, digits=1) graf=barplot(tabela,axes=FALSE,ylim=c(0,100));text(graf,porc,format(porc),pos=1);text(graf,porc," %",pos=1);text(graf,porc,format(tabela)) title(main = "Quantidade e Porcentagem das Categorias :a,b,c")
Alex, o que vc esta' observado e' a acumulacao de erros de representacao, devido ao arredondamento. Uma forma de corrigir isso eh normalizar as proporcoes. Usando os dados aos quais voce referiu-se acima:
pNaive = round(prop.table(tabela), digits=3) pFix = round(pNaive/sum(pNaive)*100, digits=1)
Entretanto, note que essa solucao (como representada acima) pode nao ser geral e exigir algumas repeticoes (afinal, a todo momento voce esta' tentando representar numeros com trocentas casas decimais num grau de granularidade bem maior).
Ivan, sobre a representacao de 9/44... Eh 0.20454545... (periodica no 45). Ou, usando a escala acima: 20.4545454545.... Arredondar para a i-esima casa decimal (pelo menos conforme eu aprendi, que eh concordante com a implementacao do R) consiste em truncar na casa (i+1), testar se aquele digito e' maior ou igual a 5 e, se sim, incrementar a casa i em 1 unidade. Dito isso:
- Arredondar para 1 digito: Segundo digito eh 5, entao incrementa o primeiro: 20.5 - Arredondar para 2 digitos: Terceiro digito eh 4, entao mantem o segundo: 20.45 - Arredondar para 3 digitos: Quarto digito eh 5, entao incrementa o terceiro: 20.455
Pode ser que a estrategia a qual voce esteja se referindo seja diferente?
b .
_______________________________________________ R-br mailing list R-br@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@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.
-- Henrique Dallazuanna Curitiba-Paraná-Brasil 25° 25' 40" S 49° 16' 22" O

elementar (depois que alguém sugere) ... Elias T. Krainski
________________________________ De: Henrique Dallazuanna <wwwhsd@gmail.com> Para: r-br@listas.c3sl.ufpr.br; Alexandro (Yahoo) <vl.alexandro@yahoo.com.br> Enviadas: Quarta-feira, 1 de Fevereiro de 2012 23:06 Assunto: Re: [R-br] arredondar soma para 100%
Alexandre,
Tente assim
diff(c(0, round(cumsum(p), 3))) * 100
2012/1/29 Alexandro (Yahoo) <vl.alexandro@yahoo.com.br>
Mauro,
usando o comando graf=barplot(tabela,axes=FALSE,ylim=c(0,100));text(graf,porc,format(porc),pos=1);text(graf,porc," %",pos=1);text(graf,porc,format(tabela))
a soma era 100,1%
depois com a grande ajuda do Benilton, substituindo porc por pFix graf=barplot(tabela,axes=FALSE,ylim=c(0,100));text(graf,pFix,format(pFix),pos=1);text(graf,pFix," %",pos=1);text(graf,pFix,format(tabela))
a soma ficou 100% > perfeito ! A lástima é que não vale para todo caso ! Daí tem que se fazer o que o Leonard disse: cada gráfico ou tabela, deve deslocar alguém para fazer os
totais fecharem com as somas.
Boa semana! Respeitosamente, Alex
________________________________ De: Mauro Sznelwar <sznelwar@uol.com.br>
Para: r-br@listas.c3sl.ufpr.br; Ivan Bezerra Allaman <ivanalaman@yahoo.com.br> Enviadas: Domingo, 29 de Janeiro de 2012 13:31
Assunto: Re: [R-br] arredondar soma para 100%
Rodei estes comandos com os anteriores e não vi diferença! a=rep("a",9);b=rep("b",30);c=rep("c",5) dados=c(a,b,c);tabela=table(dados) #porc=round(table(dados)/length(dados)*100,digits=1) pNaive = round(prop.table(tabela), digits=3) pFix = round(pNaive/sum(pNaive)*100, digits=1) graf=barplot(tabela,axes=FALSE,ylim=c(0,100));text(graf,porc,format(porc),pos=1);text(graf,porc,"
%",pos=1);text(graf,porc,format(tabela))
title(main = "Quantidade e Porcentagem das Categorias :a,b,c")
Alex, o que vc esta' observado e' a acumulacao de erros de representacao, devido ao arredondamento. Uma forma de corrigir isso eh normalizar as proporcoes. Usando os dados aos quais voce referiu-se acima:
pNaive = round(prop.table(tabela), digits=3) pFix = round(pNaive/sum(pNaive)*100, digits=1)
Entretanto, note que essa solucao (como representada acima) pode nao ser geral e exigir algumas repeticoes (afinal, a todo momento voce esta' tentando representar numeros com trocentas casas decimais num grau de granularidade bem maior).
Ivan, sobre a representacao de 9/44... Eh 0.20454545... (periodica no 45). Ou, usando a escala acima: 20.4545454545.... Arredondar para a i-esima casa decimal (pelo menos conforme eu aprendi, que eh concordante com a implementacao do R) consiste em truncar na casa (i+1), testar se aquele digito e' maior ou igual a 5 e, se sim, incrementar a casa i em 1 unidade. Dito isso:
- Arredondar para 1 digito: Segundo digito eh 5, entao incrementa o primeiro: 20.5 - Arredondar para 2 digitos: Terceiro digito eh 4, entao mantem o segundo: 20.45 - Arredondar para 3 digitos: Quarto digito eh 5, entao incrementa o terceiro: 20.455
Pode ser que a estrategia a qual voce esteja se referindo seja diferente?
b .
_______________________________________________ R-br mailing list R-br@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@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.
-- Henrique Dallazuanna Curitiba-Paraná-Brasil 25° 25' 40" S 49° 16' 22" O
_______________________________________________ R-br mailing list R-br@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.
participantes (7)
-
Alexandro (Yahoo)
-
Benilton Carvalho
-
Elias T. Krainski
-
Henrique Dallazuanna
-
Ivan Bezerra Allaman
-
Leonard de Assis
-
Mauro Sznelwar