L'une des choses qui me laissait perplexe en tant que novice de R était de savoir comment formater un nombre en pourcentage pour l'impression.
Par exemple, affichez 0.12345
como 12.345%
. Je dispose d'un certain nombre de solutions de contournement, mais aucune d'entre elles ne semble être "conviviale pour les nouveaux venus". 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 R de base pour faire cela ? Sinon, existe-t-il un paquetage largement utilisé qui fournit une enveloppe pratique ?
Malgré la recherche de quelque chose comme ça dans ?format
, ?formatC
y ?prettyNum
Je n'ai pas encore trouvé d'enveloppe convenable dans R de base. ??"percent"
n'a rien donné d'utile. library(sos); findFn("format percent")
renvoie 1250 occurrences - donc encore une fois pas utile. ggplot2
a une fonction percent
mais cela ne permet pas de contrôler la précision des arrondis.
7 votes
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, n'est-ce pas ?1 votes
A mon avis
sprintf
est parfaitement adapté au sous-ensemble des codeurs R qui sont aussi des programmeurs. J'ai beaucoup codé dans ma vie, y compris en COBOL (frisson) et en fortran (montre mon âge). Mais je ne considère pas lesprintf
règles de formatage évidentes (traduction : WTF ?). Et bien sûr, un wrapper dédié doit être plus facile à appeler que sprintf, par exemple :format_percent(x=0.12345, digits=2)
0 votes
@hircus Je pense que c'est assez commun pour mériter sa propre fonction curry courte. C'est particulièrement un problème avec Sweave, où \Sexpr {sprintf(%1.2f%%",myvar)} est bien plus moche que \Sexpr {pct(myvar)} ou toute autre fonction plus courte.
2 votes
N'est-il pas normal que les utilisateurs s'efforcent d'apprendre à utiliser les outils appropriés ? Je veux dire, apprendre à utiliser
sprintf()
ne prend guère plus de temps que de découvrir que le paquet foo contientformat_percent()
. Que se passe-t-il si l'utilisateur ne veut pas formater en pourcentage mais en quelque chose de similaire ? Il doit trouver une autre enveloppe. À long terme, l'apprentissage des outils de base sera bénéfique.1 votes
Il y a un léger problème dans le fait que
%
est le caractère de commentaire dans LaTeX, qui est le format de rapport "par défaut" pour R. Ainsi, bien qu'il puisse être utile pour étiqueter les graphiques, il faut faire attention si l'on veut que le nombre formaté soit Sweaved.0 votes
Je pourrais être en mesure d'aborder la raison pour laquelle c'est no une bonne idée, peut-être pas dans le court espace des commentaires. Je vais essayer. (1) Dans beaucoup de consultations, j'ai eu cette demande & je (en tant qu'humain) peux déduire si le nombre original est une proportion ou doit être converti comme tel ; les objets numériques arbitraires n'ont pas un tel drapeau "is-proportion". (2) En raison de (1), on peut supposer qu'une personne est capable de faire ses propres calculs, de convertir en proportions, puis de produire des résultats appropriés. (3) Satisfaire les demandes de % ouvre la porte à des problèmes avec les percentiles, par exemple lorsqu'on donne une liste de nombres.
0 votes
(Suite) Étant donné un vecteur de données numériques, une demande de percentile se présente... d'autres problèmes surgissent. (4) Pourquoi s'arrêter aux pourcentages - les points de base sont également bons. Conclusion : Je ne parle pas pour R Core, mais il est tellement facile de formater les #s par soi-même que le tout petit obstacle que cela crée signifie que l'implémenteur/utilisateur aura plus de chances d'implémenter correctement ce qu'il veut.
0 votes
(Suite) Je concède que même si je n'aime pas l'idée d'une fonction "printPercent()", je ne suis pas opposé à une fonction "multiplyBy100andAppendPercentSign()". Au moins, elle est entièrement descriptive. Elle peut également être associée, dans un package, à sa jumelle : "removePercentSignAndDivideBy100()".