173 votes

Comment formater un nombre en pourcentage dans R ?

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 le sprintf 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.

9voto

Giacomo Points 640

El tidyverse est la suivante :

> library(dplyr)
> library(scales)

> set.seed(1)
> m <- runif(5)
> dt <- as.data.frame(m)

> dt %>% mutate(perc=percent(m,accuracy=0.001))
          m    perc
1 0.2655087 26.551%
2 0.3721239 37.212%
3 0.5728534 57.285%
4 0.9082078 90.821%
5 0.2016819 20.168%

Il a l'air bien rangé, comme d'habitude.

2 votes

Bien rangé, en effet. Mais étant donné que nous accordons de l'importance au rangement, je suppose que l'on pourrait appeler la bibliothèque "scales" (comme vous l'avez fait avec "tidyverse") et laisser de côté l'opérateur ": :" qui est déroutant pour les débutants comme moi.

0 votes

Oui, je pense que vous avez raison, j'ai mis à jour la réponse.

8voto

Vous pouvez utiliser le package scales juste pour cette opération (sans le charger avec require ou library)

scales::percent(m)

4 votes

Comment donner la précision pour le nombre de chiffres ?

6voto

Ari B. Friedman Points 24940

Voici ma solution pour définir une nouvelle fonction (surtout pour pouvoir jouer avec Curry et Compose :-) ) :

library(roxygen)
printpct <- Compose(function(x) x*100, Curry(sprintf,fmt="%1.2f%%"))

0voto

light-voice Points 1
try this~

data_format <- function(data,digit=2,type='%'){
if(type=='d') {
    type = 'f';
    digit = 0;
}
switch(type,
    '%' = {format <- paste("%.", digit, "f%", type, sep='');num <- 100},
    'f' = {format <- paste("%.", digit, type, sep='');num <- 1},
    cat(type, "is not a recognized type\n")
)
sprintf(format, num * data)
}

0voto

Edwin Torres Points 73

Cette fonction pourrait transformer les données en pourcentages par colonnes

percent.colmns = function(base, columnas = 1:ncol(base), filas = 1:nrow(base)){
    base2 = base
    for(j in columnas){
        suma.c = sum(base[,j])
        for(i in filas){
            base2[i,j] = base[i,j]*100/suma.c
        }
    }
    return(base2)
}

0 votes

L'arithmétique de base est vectorisée - la boucle for interne est inefficace et inutile. Peut être remplacé par 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 comme 0.5 à "50.0%", il ne s'agit pas de faire un calcul...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X