Formatieren von Dezimalstellen in R.

264

Ich habe eine Zahl, zum Beispiel 1.128347132904321674821, die ich bei der Ausgabe auf dem Bildschirm (oder beim Schreiben in eine Datei) nur als zwei Dezimalstellen anzeigen möchte. Wie macht man das?

x <- 1.128347132904321674821

BEARBEITEN:

Die Verwendung von:

options(digits=2)

Wurde als mögliche Antwort vorgeschlagen. Gibt es eine Möglichkeit, dies in einem Skript für die einmalige Verwendung anzugeben? Wenn ich es meinem Skript hinzufüge, scheint es nichts anderes zu tun, und ich bin nicht daran interessiert, viele Zahlen erneut einzugeben, um jede Zahl zu formatieren (ich automatisiere einen sehr großen Bericht).

- -

Antwort: rund (x, Ziffern = 2)

Brandon Bertelsen
quelle
1
Verwandte Frage: stackoverflow.com/questions/2287616/…
Shane
Wenn man Optionen verwendet (Ziffern = 4), beschränkt das die Berechnungen nicht auf 4 Ziffern, oder? In diesem Fall würden Programme weitaus ungenauer. Es wirkt sich NUR auf die Nummer aus, wenn es gedruckt wird, richtig?
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.Von? -Optionen wird nur die Ausgabe beeinflusst.
Brandon Bertelsen
Beachten Sie, dass round(23, digits=2)gedruckt wird 23und nicht 23.00. Wenn Sie Letzteres möchten, versuchen Sie es mit stackoverflow.com/a/12135122/180892
Jeromy Anglim
4
@PaulHurleyuk, ich denke, es ist eine gute Praxis beim Programmieren, die minimale Anzahl von Bibliotheken so weit wie möglich zu verwenden. Jemand, der für jede triviale Anforderung eine andere Bibliothek verwendet, hat normalerweise ein Durcheinander, große Dateien, Portabilitätsprobleme usw.
Rodrigo

Antworten:

381

Hintergrund: Einige auf dieser Seite vorgeschlagenen Antworten (zB signif, options(digits=...)) nicht garantieren , dass eine bestimmte Anzahl von Dezimalstellen für eine beliebige Anzahl angezeigt werden. Ich gehe davon aus, dass dies ein Konstruktionsmerkmal in R ist, bei dem nach guter wissenschaftlicher Praxis eine bestimmte Anzahl von Ziffern auf der Grundlage der Prinzipien " signifikanter Zahlen " angezeigt wird . In vielen Domänen (z. B. APA-Stil , Geschäftsberichte) schreiben die Formatierungsanforderungen jedoch vor, dass eine bestimmte Anzahl von Dezimalstellen angezeigt wird. Dies geschieht häufig aus Gründen der Konsistenz und Standardisierung, anstatt sich mit signifikanten Zahlen zu befassen.

Lösung :

Der folgende Code zeigt genau zwei Dezimalstellen für die Zahl x.

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

Beispielsweise:

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"

Eine allgemeinere Funktion lautet wie folgt: Wo xist die Anzahl und kdie Anzahl der anzuzeigenden Dezimalstellen? trimwsEntfernt alle führenden Leerzeichen, die nützlich sein können, wenn Sie einen Zahlenvektor haben.

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

Z.B,

specify_decimal(1234, 5)
# [1] "1234.00000"
specify_decimal(0.1234, 5)
# [1] "0.12340"
Jeromy Anglim
quelle
4
+1 Nur Antwort, die für mich funktioniert hat, richtig gedruckt 0.0001als0.00
ThomasH
7
Es hat mich immer gestört, wie Funktionen funktionieren format()und prettyNum()Zahlen in Zeichen umwandeln. Wie würden Sie das angehen?
Waldir Leoncio
Was ist mit den angezeigten Zitaten?
F. Webber
2
@ JeromyAnglim Ich stelle fest, dass die obige Lösung einen möglichen Nachteil im Randfall hat, indem die Anzahl der Zeichen vor der Dezimalstelle festgelegt wird, z. B. format(c(10, 1), nsmall=1)Ausbeuten "10.0" " 1.0"(beachten Sie das führende Leerzeichen vor der 1.0. Während die sprintf()Funktion eine schönere Formatierung zu garantieren scheint beide Seiten der dezimal, zB sprintf(c(10,1), fmt = '%#.1f')wird dieser lästigen führenden Raum und kehrt zu befreien "10.0" "1.0".
Nicholas G Reich
1
Die führenden Leerzeichen sind eine Funktion zum Ausrichten des Dezimalpunkts, wenn das Ergebnis von formatin einer Spalte verwendet wird.
Einwohner
34

Sie können eine Zahl beispielsweise xbis zu Dezimalstellen formatieren, wie Sie möchten. Hier xist eine Zahl mit vielen Dezimalstellen. Angenommen, wir möchten bis zu 8 Dezimalstellen dieser Zahl anzeigen:

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

Hier werden format="f"Gleitkommazahlen mit den üblichen Dezimalstellen digitsangegeben , z. B. xxx.xxx, und die Anzahl der Ziffern angegeben. Im Gegensatz dazu würden Sie format="d"(ähnlich wie sprintf) verwenden , wenn Sie eine Ganzzahl anzeigen möchten .

SORIF HOSSAIN
quelle
Ich bin mir zwar nicht sicher, was genau das OP gefragt hat, gemessen an der am besten bewerteten Antwort, aber ich konnte nicht anders, als zu beobachten, dass formatCich fast ausschließlich diesen Zweck verwende. Ich denke, diese Antwort ist gut und befindet sich in Basis R gemäß der Anfrage des OP.
AdamO
könnte jemand von euch dabei helfen? stackoverflow.com/q/53279593/5224236
gpier
24

Sie können versuchen, mein Paket formatierbar .

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

Das Gute ist, dass xes sich immer noch um einen numerischen Vektor handelt und Sie mit derselben Formatierung mehr Berechnungen durchführen können.

> x + 1
[1] 2.13

Noch besser, die Ziffern gehen nicht verloren, Sie können jederzeit mit mehr Ziffern neu formatieren :)

> formattable(x, digits = 6, format = "f")
[1] 1.128347
Kun Ren
quelle
So ein kleiner Schwanz nervt mich den ganzen Morgen. Aus irgendeinem Grund würde R die Anzeige nur für eine Spalte abrunden. Ich brauchte dieses Update, da ich auch für diese Spalten Berechnungen durchführen musste. Das funktioniert. Vielen Dank !
Thethakuri
Ich mag formatierbar als alle baseR-Funktionen. Der größte Vorteil ist, dass die Variable numerisch bleibt.
Lazarus Thurston
22

für 2 Dezimalstellen unter der Annahme, dass Sie nach Nullen bleiben möchten

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

was gibt

[1] "5.50"

Wie @mpag unten erwähnt, scheint es, dass R damit manchmal unerwartete Werte liefern kann, und die runde Methode, z. B. sprintf (5.5550, fmt = '% #. 2f'), ergibt 5.55, nicht 5.56

Mark Adamson
quelle
1
Obwohl Sprintf-Runden, liefert Sprintf (5.5550, fmt = '% #. 2f') ein etwas unerwartetes Ergebnis: 5.55. sprintf (5.555000000001, fmt = '% #. 2f') ergibt 5.56. Dies scheint ein allgemeines "Problem" bei der Rundung in R zu sein, da die runde, kleine Methode dasselbe ergibt.
mpag
Danke @mpag, ich hatte keine Ahnung, dass R mit dem Runden auf Grenzen zu kämpfen hat. Ich habe es gerade mit 5.565 versucht, was aufrundet, während 5.545 abrundet. Ich denke, es ist die Art und Weise, wie sie mit Gleitkomma-Ungenauigkeiten umgehen. Ich glaube nicht, dass ich dieses Verhalten in anderen Sprachen gesehen habe, was bedeutet, dass sie eine integrierte Problemumgehung haben
Mark Adamson
Ich denke eher, dass sie die Werte absichtlich als in der Genauigkeit begrenzt behandeln. Sie gehen davon aus, dass ein Wert von 5,555 aus einem "realen" Wert von 5,5546 genauso wahrscheinlich resultiert wie aus einem Wert von 5,5554. Wenn Sie diese Art von Rundungsspiel fortsetzen, wird 5.444445 (ungetestet) möglicherweise als "6" angezeigt, wenn Sie jeweils eine Ziffer ausführen. Aber Sie haben vielleicht Recht, dass es darum geht, dass die binäre Darstellung etwas unter oder über 5,55 liegt.
mpag
Ja, ich denke, wenn es beabsichtigt wäre, würde es auch zwischen 5,565 und 5,545 konsistent sein. Die 'Zufälligkeit' legt für mich nahe, dass es sich um eine Gleitkommadarstellungssache handelt.
Mark Adamson
könnte jemand von euch dabei helfen? stackoverflow.com/q/53279593/5224236
gpier
8

Sowas in der Art :

options(digits=2)

Option zur Definition der Ziffern:

digits: controls the number of digits to print when printing numeric values.
Xavier V.
quelle
Gibt es eine Möglichkeit, dies beim Ausführen eines Skripts dynamisch festzulegen?
Brandon Bertelsen
Dies funktioniert für die Ausgabe in der R-Konsole, aber nicht in meinem Skript (sie kommen immer noch mit .1289273982 heraus)
Brandon Bertelsen
1
Ich bekomme ein komisches Verhalten, das digits Option scheint die Anzahl der Nachkommastellen nicht festzulegen. Wenn ich beispielsweise Optionen einstelle (Ziffern = 2), führt das Drucken von 7,25 zu einer Ausgabe von 7,2, 1234,25 zu 1234 und 0,25 bleibt zu 0,25. Gibt es eine andere Option, die damit interagiert?
Maxim.K
8

Überprüfen Sie die Funktionen PrettyNum, Format

Probieren von Nullen (z. B. 123.1240) verwenden sprintf(x, fmt='%#.4g')

ilya
quelle
@ 42 Ich würde befürworten zu lernen sprintf, es ist im Grunde ein Rahmen für die Formatierung
jangorecki
1
@jangorecki Ich bin mir nicht sicher, was du meinst. Alles, was ich (vor mehr als 5 Jahren) getan habe, war eine Rechtschreibkorrektur vorzuschlagen.
IRTFM
@ 42 Ich zögere, dass Sie sich über das Argument beschweren fmt, sorry!
Jangorecki
Ich denke, das OP steht eher nach festen Dezimalstellen als nach festen Ziffern. Es scheint, dass die gin Ihrer Antwort für feste Ziffern ist, mit ffunktioniert besser.
Mark Adamson
5

Wenn Sie signifikante Ziffern festen Ziffern vorziehen, kann der Befehl signieren hilfreich sein:

> signif(1.12345, digits = 3)
[1] 1.12
> signif(12.12345, digits = 3)
[1] 12.1
> signif(12345.12345, digits = 3)
[1] 12300
Paul Hurleyuk
quelle
1
Danke Paul. Diese beiden waren nicht genau das, wonach ich gesucht hatte, aber die Bedeutung führte mich zu round (), was genau das war, was ich brauchte. Prost,
Brandon Bertelsen
34
Error: could not find function "fixed"
ThomasH
signiffunktioniert für die angegebene Nummer, aber ich gehe davon aus, dass das häufig angewendete Problem darin besteht, dass Sie genau zwei Dezimalstellen anzeigen müssen, aber nicht wissen, wie hoch die Nummer im Voraus ist. In diesem Fall signifwird abhängig von der tatsächlichen Anzahl eine unterschiedliche Anzahl von Dezimalstellen angegeben.
Jeromy Anglim
3
behoben ist nirgendwo zu finden. Bitte beheben Sie das Problem, da sonst diese irreführende Antwort gelöscht werden sollte.
HelloWorld
@ JeromyAnglim Wie beheben wir das, wenn wir 3sf wollen? manchmal gibt es mir 3sf, manchmal 4sf usw. Wie beheben wir das?
christouandr7
4

Mit dieser Funktion formatC()kann eine Zahl auf zwei Dezimalstellen formatiert werden. Diese Funktion gibt zwei Dezimalstellen an, selbst wenn die resultierenden Werte nachgestellte Nullen enthalten.

Chernoff
quelle
3

Ich verwende diese Variante für den Kraftdruck K Dezimalstellen:

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

Beachten Sie, dass numerische Objekte in R mit doppelter Genauigkeit gespeichert werden , wodurch Sie (ungefähr) 16 Dezimalstellen erhalten - der Rest ist Rauschen. Ich gebe zu, dass die oben gezeigte Nummer wahrscheinlich nur ein Beispiel ist, aber 22 Ziffern lang.

nullglob
quelle
3
Bestätigt, es ist nur ein Beispiel. Ich habe die Tastatur zerdrückt.
Brandon Bertelsen
1

Sieht für mich so aus

library(tutoR)
format(1.128347132904321674821, 2)

Per ein wenig Online-Hilfe .

Tim Meers
quelle
Ich habe dies gefunden, aber es erfordert ein Paket. Ich suche etwas innerhalb des Basispakets.
Brandon Bertelsen
2
@brandon, format () ist Teil der Basis. Öffnen Sie R und geben Sie? Format ein ... keine Pakete erforderlich.
JD Long
Hrmmm, haben Sie sich angesehen, was dies ausgibt? [1] "1.128347" ansonsten hast du recht damit, dass es im Basispaket ist, mein schlechtes.
Brandon Bertelsen
1
Versuchen Sie es vielleicht mit format.default(x, digits = 2)einem Schuss im Dunkeln, basierend auf dem angegebenen Link. Diese Informationen fehlen, was ich normalerweise für die Dokumentation gelesen habe. Ich habe erwartet, dass auch die gedruckten Ausgaben angezeigt werden.
Tim Meers
Ich habe gerade bemerkt, dass Ihr Link auf die TutoR-Dokumentation verweist, die nicht Teil der Basis ist.
Brandon Bertelsen
1

Wenn Sie nur eine Zahl oder eine Liste runden möchten, verwenden Sie einfach

round(data, 2)

Dann werden die Daten auf 2 Dezimalstellen gerundet.

jared
quelle