Formatage des décimales dans R

264

J'ai un nombre, par exemple 1.128347132904321674821 que je voudrais montrer comme seulement deux décimales lors de la sortie sur écran (ou écrit dans un fichier). Comment fait-on cela?

x <- 1.128347132904321674821

ÉDITER:

L'utilisation de:

options(digits=2)

A été suggéré comme réponse possible. Existe-t-il un moyen de spécifier cela dans un script pour une utilisation unique? Quand je l'ajoute à mon script, cela ne semble pas faire quelque chose de différent et je ne suis pas intéressé par beaucoup de retaper pour formater chaque nombre (j'automatise un très gros rapport).

-

Réponse: rond (x, chiffres = 2)

Brandon Bertelsen
la source
1
Question connexe: stackoverflow.com/questions/2287616/…
Shane
Si l'on utilise des options (chiffres = 4), cela ne limite pas les calculs à 4 chiffres, n'est-ce pas? Dans ce cas, cela rendrait les programmes beaucoup moins précis. Cela affecte UNIQUEMENT le nombre lors de son impression, correct?
MikeZ
controls the number of digits to print when printing numeric values. It is a suggestion only. Valid values are 1...22 with default 7. See the note in print.default about values greater than 15.à partir des options, il n'effectue que la sortie.
Brandon Bertelsen
Notez que round(23, digits=2)cela s'imprimera 23et non 23.00. Si vous voulez ce dernier, essayez stackoverflow.com/a/12135122/180892
Jeromy Anglim
4
@PaulHurleyuk, je pense que c'est une bonne pratique en programmation d'utiliser le minimum de bibliothèques possible. Quelqu'un qui utilise une bibliothèque différente pour chaque besoin trivial se retrouve généralement avec un désordre, de gros fichiers, des problèmes de portabilité, etc.
Rodrigo

Réponses:

381

Contexte: Quelques suggestions de réponses sur cette page (par exemple signif, options(digits=...)) ne garantit pas qu'un certain nombre de décimales sont affichées pour un nombre arbitraire. Je suppose que c'est une caractéristique de conception de R dans laquelle les bonnes pratiques scientifiques impliquent d'afficher un certain nombre de chiffres sur la base des principes des " chiffres significatifs ". Cependant, dans de nombreux domaines (par exemple, style APA , rapports commerciaux), les exigences de formatage imposent l'affichage d'un certain nombre de décimales. Cela se fait souvent à des fins de cohérence et de normalisation plutôt que de se préoccuper de chiffres importants.

Solution :

Le code suivant montre exactement deux décimales pour le nombre x.

format(round(x, 2), nsmall = 2)

Par exemple:

format(round(1.20, 2), nsmall = 2)
# [1] "1.20"
format(round(1, 2), nsmall = 2)
# [1] "1.00"
format(round(1.1234, 2), nsmall = 2)
# [1] "1.12"

Une fonction plus générale est la suivante: où xest le nombre et kle nombre de décimales à afficher. trimwssupprime tout premier espace blanc qui peut être utile si vous avez un vecteur de nombres.

specify_decimal <- function(x, k) trimws(format(round(x, k), nsmall=k))

Par exemple,

specify_decimal(1234, 5)
# [1] "1234.00000"
specify_decimal(0.1234, 5)
# [1] "0.12340"
Jeromy Anglim
la source
4
+1 Seule réponse qui a fonctionné pour moi, correctement imprimée 0.0001comme0.00
ThomasH
7
Cela m'a toujours dérangé de voir comment les fonctions aiment format()et prettyNum()transforment les chiffres en caractères. Comment aborderiez-vous cela?
Waldir Leoncio
Qu'en est-il des citations qui apparaissent?
F.Webber
2
@JeromyAnglim Je note que la solution ci-dessus présente un inconvénient possible en cas de bord de fixation du nombre de caractères devant la décimale, par exemple les format(c(10, 1), nsmall=1)rendements "10.0" " 1.0"(notez l'espace de tête devant le 1.0. Alors que la sprintf()fonction semble garantir un formatage plus agréable sur des deux côtés de la décimale, par exemple, sprintf(c(10,1), fmt = '%#.1f')se débarrasse de cet espace ennuyeux et revient "10.0" "1.0".
Nicholas G Reich
1
Les espaces de début sont une fonction conçue pour aligner le point décimal lorsque le résultat de formatest utilisé dans une colonne.
Habitante
34

Vous pouvez formater un nombre, disons x, jusqu'à la décimale comme vous le souhaitez. Voici xun nombre avec de nombreuses décimales. Supposons que nous souhaitons afficher jusqu'à 8 décimales de ce nombre:

x = 1111111234.6547389758965789345
y = formatC(x, digits = 8, format = "f")
# [1] "1111111234.65473890"

Ici format="f"donne des nombres flottants dans les décimales habituelles disons, xxx.xxx, et digitsspécifie le nombre de chiffres. En revanche, si vous vouliez afficher un entier, vous l'utiliseriez format="d"(un peu comme sprintf).

SORIF HOSSAIN
la source
Bien que je ne sache pas exactement ce que le PO demandait, à en juger par la réponse la mieux notée, je n'ai pas pu m'empêcher de remarquer que formatCc'est presque exclusivement ce que j'utilise à cette fin. Je pense que cette réponse est bonne et se trouve dans la base R selon la demande du PO.
AdamO
l'un de vous pourrait-il aider? stackoverflow.com/q/53279593/5224236
gpier
24

Vous pouvez essayer mon package formatable .

> # devtools::install_github("renkun-ken/formattable")
> library(formattable)
> x <- formattable(1.128347132904321674821, digits = 2, format = "f")
> x
[1] 1.13

La bonne chose est, xest toujours un vecteur numérique et vous pouvez faire plus de calculs avec le même formatage.

> x + 1
[1] 2.13

Encore mieux, les chiffres ne sont pas perdus, vous pouvez reformater avec plus de chiffres à tout moment :)

> formattable(x, digits = 6, format = "f")
[1] 1.128347
Kun Ren
la source
Une si petite piqûre me dérange toute la matinée. Pour une raison quelconque, R arrondirait l'affichage pour une colonne uniquement. J'avais besoin de ce correctif car je devais également effectuer des calculs sur ces colonnes. Cela marche. Merci !
thethakuri
J'aime formatable que toutes les fonctions baseR. Le plus grand avantage est qu'il conserve la variable sous forme numérique.
Lazarus Thurston
22

pour 2 décimales en supposant que vous souhaitez conserver les zéros de fin

sprintf(5.5, fmt = '%#.2f')

qui donne

[1] "5.50"

Comme @mpag le mentionne ci-dessous, il semble que R puisse parfois donner des valeurs inattendues avec cela et la méthode ronde, par exemple sprintf (5.5550, fmt = '% #. 2f') donne 5.55, pas 5.56

Mark Adamson
la source
1
cependant, bien que sprintf arrondisse, sprintf (5.5550, fmt = '% #. 2f') donne un résultat légèrement inattendu: 5.55. sprintf (5.555000000001, fmt = '% #. 2f') donne 5,56. Cela semble être un "problème" général avec l'arrondi dans R, comme la méthode round, nsmall donne la même chose.
mpag
Merci @mpag, je ne savais pas que R avait du mal à arrondir les limites, je viens de l'essayer avec 5.565 qui arrondit, tandis que 5.545 arrondit. Je suppose que c'est la façon dont ils traitent la précision en virgule flottante. Je ne pense pas avoir vu ce comportement dans d'autres langues, ce qui signifie, je suppose, qu'ils ont une solution de contournement intégrée
Mark Adamson
Je pense plutôt qu'ils traitent intentionnellement les valeurs comme limitées dans le degré de précision. Ils pensent qu'une valeur de 5,555 est tout aussi susceptible d'avoir résulté d'une valeur "réelle" de 5,5546 que de 5,5554. Cependant, si vous continuez ce type d'arrondi, le 5.444445 pourrait (non testé) finir par "6" si vous le faites un chiffre à la fois. Mais vous avez peut-être raison de penser que la représentation binaire peut être légèrement inférieure ou supérieure à 5,55.
mpag
Oui, je pense que si c'était intentionnel, il serait également cohérent entre 5.565 et 5.545. Le «hasard» me suggère qu'il s'agit d'une représentation en virgule flottante.
Mark Adamson
l'un de vous pourrait-il aider? stackoverflow.com/q/53279593/5224236
gpier
8

Quelque chose comme ca :

options(digits=2)

Option de définition des chiffres:

digits: controls the number of digits to print when printing numeric values.
Xavier V.
la source
Existe-t-il un moyen de définir cela dynamiquement lors de l'exécution d'un script?
Brandon Bertelsen
Cela fonctionne pour la sortie dans la console R, mais ne fonctionne pas dans mon script (ils sortent toujours avec .1289273982)
Brandon Bertelsen
1
J'obtiens un comportement bizarre, l' digitsoption ne semble pas définir le nombre de chiffres après la décimale. Par exemple, lorsque je définis des options (chiffres = 2), l'impression de 7,25 entraîne une sortie de 7,2, 1234,25 devient 1234 et 0,25 reste 0,25. Y a-t-il une autre option interagissant avec cela?
Maxim.K
8

Vérifiez les fonctions prettyNum, format

pour avoir des zéros d'essai (123.1240 par exemple) utiliser sprintf(x, fmt='%#.4g')

il y a
la source
@ 42 Je recommanderais d'apprendre sprintf, c'est essentiellement un cadre de formatage
jangorecki
1
@jangorecki Je ne suis pas sûr de votre point. Tout ce que j'ai fait (il y a 5 ans et plus) a été de suggérer une correction orthographique.
IRTFM
@ 42 J'ai du mal à vous plaindre sur l' fmtargument, désolé!
jangorecki
Je pense que l'OP est après des décimales fixes plutôt que des chiffres fixes. Il semble que gvotre réponse soit pour les chiffres fixes, en utilisant fmieux les travaux.
Mark Adamson
5

Si vous préférez des chiffres significatifs à des chiffres fixes, la commande signif peut être utile:

> signif(1.12345, digits = 3)
[1] 1.12
> signif(12.12345, digits = 3)
[1] 12.1
> signif(12345.12345, digits = 3)
[1] 12300
PaulHurleyuk
la source
1
Merci Paul. Ces deux n'étaient pas exactement ce que je cherchais, mais signif m'a conduit à round () qui est exactement ce dont j'avais besoin. Santé,
Brandon Bertelsen
34
Error: could not find function "fixed"
ThomasH
signiffonctionne pour le nombre spécifique fourni, mais je suppose que le problème commun appliqué est lorsque vous devez afficher exactement deux décimales mais que vous ne savez pas quel est le nombre à l'avance. Dans ce cas, signifdonnera différents nombres de décimales en fonction du nombre réel.
Jeromy Anglim
3
fixe ne se trouve nulle part. Veuillez le corriger, sinon cette réponse trompeuse devrait être supprimée.
HelloWorld
@JeromyAnglim comment résoudre ce problème lorsque nous voulons 3 pieds carrés? parfois cela me donne 3 pieds carrés, d'autres fois 4 pieds carrés, etc. comment pouvons-nous résoudre ce problème?
christouandr7
4

La fonction formatC()peut être utilisée pour formater un nombre à deux décimales. Deux décimales sont données par cette fonction même lorsque les valeurs résultantes incluent des zéros de fin.

Chernoff
la source
3

J'utilise cette variante pour forcer l'impression K décimales:

# format numeric value to K decimal places
formatDecimal <- function(x, k) format(round(x, k), trim=T, nsmall=k)
Eldar Agalarov
la source
2

Notez que les objets numériques dans R sont stockés avec une double précision , ce qui vous donne (environ) 16 chiffres décimaux de précision - le reste sera du bruit. J'accorde que le nombre indiqué ci-dessus est probablement juste pour un exemple, mais il est long de 22 chiffres.

nullglob
la source
3
Confirmé, c'est juste pour un exemple. J'ai écrasé le clavier.
Brandon Bertelsen
1

Il me semble que ce serait quelque chose comme

library(tutoR)
format(1.128347132904321674821, 2)

Par une petite aide en ligne .

Tim Meers
la source
J'ai trouvé cela, mais cela nécessite un package, je cherche quelque chose dans le package de base.
Brandon Bertelsen
2
@brandon, format () fait partie de la base. Ouvrez R et tapez? Format ... aucun paquet n'est nécessaire.
JD Long
Hmmm, avez-vous regardé ce que cela produit? [1] "1.128347" sinon, vous avez tout à fait raison qu'il soit dans le package de base, mon mauvais.
Brandon Bertelsen
1
Essayez peut-être format.default(x, digits = 2)juste un cliché dans le noir en vous basant sur le lien fourni. Cette information est un peu ce qui manque à ce que je lis normalement pour la documentation, je m'attendais à voir également les sorties imprimées.
Tim Meers
Je viens de remarquer que votre lien pointe vers la documentation tutoR, qui ne fait pas partie de la base.
Brandon Bertelsen
1

si vous voulez simplement arrondir un nombre ou une liste, utilisez simplement

round(data, 2)

Ensuite, les données seront arrondies à la deuxième décimale.

jared
la source