L'une des choses qui me rendait perplexe en tant que nouveau venu chez R était de savoir comment formater un nombre en pourcentage pour l'impression.
Par exemple, affichez 0.12345
comme 12.345%
. J'ai un certain nombre de solutions de contournement pour cela, mais aucune de celles-ci ne semble être "newby friendly". Par exemple:
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%"
Question: Existe - t-il une fonction de base R pour ce faire? Sinon, existe-t-il un package largement utilisé qui fournit un emballage pratique?
Malgré la recherche de quelque chose comme ça dans ?format
, ?formatC
et ?prettyNum
, je dois encore trouver un emballage convenablement pratique dans la base R. ??"percent"
n'a donné quelque chose d' utile. library(sos); findFn("format percent")
renvoie 1250 hits - donc encore une fois pas utile. ggplot2
a une fonction percent
mais cela ne donne aucun contrôle sur la précision d'arrondi.
la source
sprintf
semble être la solution préférée sur les listes de diffusion, et je n'ai pas vu de meilleure solution. Toute fonction intégrée ne sera pas beaucoup plus simple à appeler de toute façon, non?sprintf
convient parfaitement à ce sous-ensemble de codeurs R qui sont également des programmeurs. J'ai beaucoup codé dans ma vie, y compris COBOL (frisson) et fortran (montre mon âge). Mais je ne considère pas lessprintf
règles de formatage comme évidentes (traduction: WTF?). Et bien sûr, un wrapper dédié doit être plus facile à appeler qu'un sprintf, par exemple:format_percent(x=0.12345, digits=2)
sprintf()
ne prend guère plus de temps que de découvrir ce que contient le paquet fooformat_percent()
. Que se passe-t-il si l'utilisateur ne souhaite pas formater en pourcentage mais quelque chose d'autre qui est similaire? Ils ont besoin de trouver un autre emballage. À long terme, l'apprentissage des outils de base sera bénéfique.%
c'est le caractère de commentaire dans LaTeX, qui est le format de rapport "par défaut" pour R. Donc, même s'il peut être utile pour étiqueter les graphiques, il faut faire attention si le nombre formaté doit être Sweaved.Réponses:
Encore plus tard:
Comme l'a souligné @DzimitryM,
percent()
a été «retiré» en faveur delabel_percent()
, qui est un synonyme de l'anciennepercent_format()
fonction.label_percent()
renvoie une fonction, donc pour l'utiliser, vous avez besoin d'une paire supplémentaire de parenthèses.Personnalisez-le en ajoutant des arguments dans le premier jeu de parenthèses.
Une mise à jour, plusieurs années plus tard:
De nos jours, il y a une
percent
fonction dans lescales
package, comme indiqué dans la réponse de krlmlr. Utilisez cela au lieu de ma solution roulée à la main.Essayez quelque chose comme
Avec l'utilisation, par exemple,
(Si vous préférez, changez le format de
"f"
à"g"
.)la source
scales
ver. Le manuel 1.1.0 indique:percent()
est retiré; veuillez utiliser à lalabel_percent()
place, ce qui ne convient pas au formatage des nombres . Pour que la solution roulée à la main soit toujours d'actualitéDécouvrez le
scales
package. Cela faisait partie deggplot2
, je pense.La logique intégrée de détection de la précision devrait fonctionner suffisamment bien dans la plupart des cas.
la source
percent(-0.1)
produitNaN%
scales::percent(c(-0.1, -0.2))
scales::percent(c(-0.1,-0.1,-0.1))
produit"NaN%" "NaN%" "NaN%"
mais votre exemple fonctionne. Pour la référence des autres, le bogue n'est pas encore corrigé en date duscales_0.2.4
. De plus, à ce jour, la demande de tirage correspondante la fixant n'est pas encore fusionnée dans la branche principale.Découvrez la
percent
fonction duformattable
package:la source
scales::percent
n'est pas le cas dans les deux premières réponses.J'ai fait quelques comparaisons de vitesse sur ces réponses et j'ai été surpris de voir
percent
dans lescales
paquet si vanté, compte tenu de sa lenteur. J'imagine que l'avantage est son détecteur automatique pour un formatage correct, mais si vous savez à quoi ressemblent vos données, il semble clair à éviter.Voici les résultats de la tentative de mise en forme d'une liste de 100 000 pourcentages en (0,1) en un pourcentage à 2 chiffres:
Cela
sprintf
ressort clairement comme un gagnant lorsque nous voulons ajouter un signe de pourcentage. Par contre, si nous voulons seulement multiplier le nombre et arrondir (passer de proportion en pourcentage sans "%", alorsround()
c'est le plus rapide:la source
Vous pouvez utiliser le package scale juste pour cette opération (sans le charger avec require ou une bibliothèque)
la source
Voici ma solution pour définir une nouvelle fonction (principalement pour que je puisse jouer avec Curry et Compose :-)):
la source
Voyant comment il
scalable::percent
avait déjà été démontré que c'était le plus lent et que Liliana Pacheco proposait une autre solution, je suis allé de l'avant et j'ai essayé de la comparer à certaines des autres options basées sur l'exemple de Michael:Voici les résultats que j'ai obtenus:
Je n'ai aucune idée, cependant, pourquoi mon
krlmlr()
et aandrie1()
exécuté tellement pire que dans l'exemple de MichaelChirico. Des indices?la source
la source
Cette fonction pourrait transformer les données en pourcentages par colonnes
la source
base2[, j] = base[ , j] * 100 / suma.c
. Il convient également de noter que ce n'est pas exactement une réponse à la question ... la question porte sur le formatage de quelque chose comme0.5
"50,0%", pas sur le calcul ...La
tidyverse
version est la suivante:Il a l'air bien rangé comme d'habitude.
la source