Uma das coisas que costumava me deixar perplexo como um novato em R era como formatar um número como uma porcentagem para impressão.
Por exemplo, exiba 0.12345
como 12.345%
. Eu tenho várias soluções alternativas para isso, mas nenhuma delas parece ser "newby friendly". Por exemplo:
set.seed(1)
m <- runif(5)
paste(round(100*m, 2), "%", sep="")
[1] "26.55%" "37.21%" "57.29%" "90.82%" "20.17%"
sprintf("%1.2f%%", 100*m)
[1] "26.55%" "37.21%" "57.29%" "90.82%" "20.17%"
Pergunta: Existe uma função R básica para fazer isso? Como alternativa, existe um pacote amplamente usado que fornece um invólucro conveniente?
Apesar de procurar algo assim em ?format
, ?formatC
e ?prettyNum
, ainda não encontrei um invólucro adequadamente conveniente na base R. ??"percent"
não produziu nada de útil. library(sos); findFn("format percent")
retorna 1250 hits - mais uma vez não é útil. ggplot2
tem uma função, percent
mas isso não dá controle sobre a precisão do arredondamento.
fonte
sprintf
parece ser a solução favorita nas listas de discussão e não vi nenhuma solução melhor. Qualquer função embutida não será muito mais simples de chamar, certo?sprintf
é perfeitamente adequado para esse subconjunto de codificadores R que também são programadores. Eu codifiquei muito na minha vida, incluindo COBOL (arrepio) e fortran (mostra minha idade). Mas não considero assprintf
regras de formatação óbvias (tradução: WTF?). E, claro, um invólucro dedicado deve ser mais fácil de chamar do que sprintf, por exemplo:format_percent(x=0.12345, digits=2)
sprintf()
dificilmente é mais demorado do que descobrir que pacote foo contémformat_percent()
. O que acontece se o usuário não quiser formatar como porcentagem, mas outra coisa semelhante? Eles precisam encontrar outro invólucro. A longo prazo, o aprendizado das ferramentas básicas será benéfico.%
é o caractere de comentário no LaTeX, que é o formato de relatório "padrão" para R. Portanto, embora possa ser útil para rotular gráficos, é preciso ter cuidado para que o número formatado seja Sweaved.Respostas:
Mais tarde:
Como apontado por @DzimitryM,
percent()
foi "aposentado" em favor delabel_percent()
, que é um sinônimo para apercent_format()
função antiga .label_percent()
retorna uma função; portanto, para usá-la, você precisa de um par extra de parênteses.Personalize isso adicionando argumentos dentro do primeiro conjunto de parênteses.
Uma atualização, vários anos depois:
Atualmente, há uma
percent
função noscales
pacote, conforme documentado na resposta do krlmlr. Use isso em vez da minha solução enrolada à mão.Tente algo como
Com o uso, por exemplo,
(Se preferir, altere o formato de
"f"
para"g"
.)fonte
scales
ver. 1.1.0 manual diz:percent()
está aposentado; use emlabel_percent()
vez disso, o que não é adequado para a formatação de números . Para que a solução laminada à mão ainda seja relevanteConfira o
scales
pacote. Costumava fazer parteggplot2
, eu acho.A lógica interna para detectar a precisão deve funcionar bem o suficiente para a maioria dos casos.
fonte
percent(-0.1)
produzNaN%
scales::percent(c(-0.1, -0.2))
scales::percent(c(-0.1,-0.1,-0.1))
produz ,"NaN%" "NaN%" "NaN%"
mas o seu exemplo funciona. Para referência de outras pessoas, o bug ainda não foi corrigido a partir descales_0.2.4
. Além disso, a partir de hoje, a solicitação pull correspondente que a corrige ainda não foi mesclada na ramificação principal.Confira a
percent
função doformattable
pacote:fonte
scales::percent
nas duas primeiras respostas não.Fiz alguns testes comparativos para acelerar essas respostas e fiquei surpreso ao ver
percent
oscales
pacote tão elogiado, dada a sua lentidão. Imagino que a vantagem seja seu detector automático para uma formatação adequada, mas se você souber como seus dados parecem, parece claro que deve ser evitado.Aqui estão os resultados da tentativa de formatar uma lista de 100.000 porcentagens em (0,1) para uma porcentagem em 2 dígitos:
Assim,
sprintf
surge como um vencedor claro quando queremos adicionar um sinal de porcentagem. Por outro lado, se apenas queremos multiplicar o número e a ronda (passe de proporção para porcentagem sem "%", entãoround()
é mais rápido:fonte
Você pode usar o pacote de escalas apenas para esta operação (sem carregá-lo com require ou library)
fonte
Aqui está minha solução para definir uma nova função (principalmente para que eu possa brincar com Curry e Compose :-)):
fonte
Vendo como
scalable::percent
já havia se mostrado mais lento e Liliana Pacheco oferecendo outra solução, fui em frente e tentei compará-lo com algumas das outras opções com base no exemplo de Michael:Estes são os resultados que obtive:
Eu não tenho idéia, porém, por que o meu
krlmlr()
eandrie1()
realizada de modo muito pior do que no exemplo de MichaelChirico. Alguma pista?fonte
fonte
Esta função pode transformar os dados em porcentagens por colunas
fonte
base2[, j] = base[ , j] * 100 / suma.c
. Também vale a pena notar que essa não é exatamente uma resposta para a pergunta ... a questão é sobre formatar algo como0.5
"50,0%", não é sobre fazer um cálculo ...A
tidyverse
versão é esta:Parece arrumado, como de costume.
fonte