Una de las cosas que solía dejarme perplejo como novato en R era cómo formatear un número como porcentaje para imprimir.
Por ejemplo, mostrar 0.12345
como 12.345%
. Tengo varias soluciones para esto, pero ninguna de estas parece ser "nueva para los amigos". Por ejemplo:
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%"
Pregunta: ¿Hay una función R base para hacer esto? Alternativamente, ¿hay un paquete ampliamente utilizado que proporcione una envoltura conveniente?
A pesar de buscar algo como esto en ?format
, ?formatC
y ?prettyNum
, todavía tengo que encontrar una envoltura convenientemente conveniente en la base R. ??"percent"
no produjo nada útil. library(sos); findFn("format percent")
devuelve 1250 visitas, así que de nuevo no es útil. ggplot2
tiene una función percent
pero esto no da control sobre la precisión de redondeo.
fuente
sprintf
Parece ser la solución favorita en las listas de correo, y no he visto ninguna solución mejor. Cualquier función incorporada no será mucho más fácil de llamar de todos modos, ¿verdad?sprintf
está perfectamente bien para ese subconjunto de codificadores R que también resultan ser programadores. He codificado mucho en mi vida, incluyendo COBOL (estremecimiento) y fortran (muestra mi edad). Pero no considerosprintf
obvias las reglas de formato (traducción: ¿WTF?). Y, por supuesto, un contenedor dedicado debe ser más fácil de llamar que sprintf, por ejemplo:format_percent(x=0.12345, digits=2)
sprintf()
es apenas más tiempo que la de descubrir que el paquete foo contieneformat_percent()
. ¿Qué sucede si el usuario no quiere formatear como porcentaje, sino algo similar? Necesitan encontrar otro contenedor. A la larga, aprender las herramientas básicas será beneficioso.%
el carácter de comentario en LaTeX, que es el formato de informe "predeterminado" para R. Por lo tanto, si bien puede ser útil para etiquetar gráficos, se debe tener cuidado si el número formateado debe ser Sweaved.Respuestas:
Aun mas tarde:
Como señaló @DzimitryM,
percent()
ha sido "retirado" a favor delabel_percent()
, que es sinónimo de lapercent_format()
función anterior.label_percent()
devuelve una función, por lo que para usarla, necesita un par adicional de paréntesis.Personalice esto agregando argumentos dentro del primer conjunto de paréntesis.
Una actualización, varios años después:
En estos días hay una
percent
función en elscales
paquete, como se documenta en la respuesta de krlmlr. Use eso en lugar de mi solución enrollada a mano.Intenta algo como
Con el uso, por ejemplo,
(Si lo prefiere, cambie el formato de
"f"
a"g"
).fuente
scales
ver. 1.1.0 manual dice:percent()
está retirado; utilicelabel_percent()
en su lugar, lo que no es adecuado para el formato de números . Para que la solución enrollada a mano siga siendo relevanteMira el
scales
paquete. Solía ser parte deggplot2
, creo.La lógica incorporada para detectar la precisión debería funcionar lo suficientemente bien para la mayoría de los casos.
fuente
percent(-0.1)
produceNaN%
scales::percent(c(-0.1, -0.2))
scales::percent(c(-0.1,-0.1,-0.1))
produce"NaN%" "NaN%" "NaN%"
pero tu ejemplo funciona. Para referencia de otros, el error aún no se ha solucionado a partir descales_0.2.4
. Además, a partir de hoy, la solicitud de extracción correspondiente que lo arregla aún no se ha fusionado en la rama principal.Echa un vistazo a la
percent
función delformattable
paquete:fuente
scales::percent
en las dos primeras respuestas no.Hice algunas evaluaciones comparativas para la velocidad en estas respuestas y me sorprendió ver
percent
en elscales
paquete tan promocionado, dada su lentitud. Me imagino que la ventaja es su detector automático para un formateo adecuado, pero si sabe cómo se ven sus datos, parece claro que debe evitarse.Estos son los resultados de intentar formatear una lista de 100,000 porcentajes en (0,1) a un porcentaje en 2 dígitos:
Entonces
sprintf
surge como un claro ganador cuando queremos agregar un signo de porcentaje. Por otro lado, si solo queremos multiplicar el número y redondear (pasar de proporción a porcentaje sin "%", entoncesround()
es más rápido:fuente
Puede usar el paquete de escalas solo para esta operación (sin cargarlo con require o library)
fuente
Aquí está mi solución para definir una nueva función (principalmente para poder jugar con Curry y Compose :-)):
fuente
Al ver cómo
scalable::percent
ya se había demostrado que era más lento y Liliana Pacheco ofrecía otra solución, seguí adelante e intenté compararlo con algunas de las otras opciones basadas en el ejemplo que Michael estableció:Estos son los resultados que obtuve:
No tengo ni idea, sin embargo, por qué mi
krlmlr()
yandrie1()
realiza de manera mucho peor que en el ejemplo de MichaelChirico. ¿Alguna pista?fuente
fuente
Esta función podría transformar los datos en porcentajes por columnas.
fuente
base2[, j] = base[ , j] * 100 / suma.c
. También vale la pena señalar que esto no es exactamente una respuesta a la pregunta ... la pregunta es sobre formatear algo como0.5
"50.0%", no sobre hacer un cálculo ...La
tidyverse
versión es esta:Se ve ordenado como de costumbre.
fuente