2016-03-28 5 views
0

Ich bin mit der round()-Funktion, die nach Hilfe`round()` zu vielen Stellen in R

Runde der Werte in ihrem ersten Argumente an die angegebenen Nummer der Dezimalstellen (default 0) .

Und das digits Argument in round(x, digits = 0) ist eine

ganze Zahl, die die Anzahl der Nachkommastellen (rund).

Kann jemand diese Ausgabe erklären? Weil es anscheinend nicht wie angekündigt funktioniert. Aber vielleicht habe ich etwas übersehen.

> round(x = 234234.3456789, digits = 0) 
[1] 234234 
> round(x = 234234.3456789, digits = 1) 
[1] 234234.3 
> round(x = 234234.3456789, digits = 2) 
[1] 234234.4 
> round(x = 234234.3456789, digits = 3) 
[1] 234234.3 
> round(x = 234234.3456789, digits = 4) 
[1] 234234.3 
> round(x = 234234.3456789, digits = 5) 
[1] 234234.3 
> round(x = 234234.3456789, digits = 6) 
[1] 234234.3 
> round(x = 234234.3456789, digits = 7) 
[1] 234234.3 

Ich habe versucht, die Zahl zu ändern und es scheint, es ist nicht von Ziffern angegeben, die die Anzahl von Dezimalstellen gerundet (wie angegeben), sondern auf die Gesamtzahl der Plätze durch das Argument Ziffern angegeben

>  round(x = 34.3456789, digits = 0) 
[1] 34 
>  round(x = 34.3456789, digits = 1) 
[1] 34.3 
>  round(x = 34.3456789, digits = 2) 
[1] 34.35 
>  round(x = 34.3456789, digits = 3) 
[1] 34.346 
>  round(x = 34.3456789, digits = 4) 
[1] 34.3457 
>  round(x = 34.3456789, digits = 5) 
[1] 34.34568 
>  round(x = 34.3456789, digits = 6) 
[1] 34.34568 
>  round(x = 34.3456789, digits = 7) 
[1] 34.34568 

Das ist komisch für mich. Aber vielleicht mache ich gerade etwas falsch.

Auf der Suche nach einer Erklärung fand ich this other question here in SO und eines der Beispiele dort scheint tatsächlich zu funktionieren, wie ich erwartet hatte.

x <- c(pi, pi*1000, pi/1000) 

> round(x, digits = 0) 
[1] 3 3142 0 
> round(x, digits = 1) 
[1] 3.1 3141.6 0.0 
> round(x, digits = 2) 
[1] 3.14 3141.59 0.00 
> round(x, digits = 3) 
[1] 3.142 3141.593 0.003 
> round(x, digits = 3) 
[1] 3.142 3141.593 0.003 
> round(x, digits = 4) 
[1] 3.1416 3141.5927 0.0031 
> round(x, digits = 5) 
[1] 3.14159 3141.59265 0.00314 
> round(x, digits = 6) 
[1] 3.141593 3141.592654 0.003142 
> round(x, digits = 7) 
[1] 3.1415927 3141.5926536 0.0031416 

Aber wenn ich versuche, etwas ähnliches mit meinem ursprünglichen Beispiel, funktioniert es nicht. Tatsächlich funktioniert etwas so ähnliches wie , anstatt x <- c(pi, pi*1000, pi/1000) nicht (beachten Sie die letzten beiden, fügt es nicht eine weitere Dezimalstelle, sondern eine Art von Kürzungen auf 7 Positionen insgesamt).

x <- c(pi, pi, pi) 
> round(x, digits = 0) 
[1] 3 3 3 
> round(x, digits = 1) 
[1] 3.1 3.1 3.1 
> round(x, digits = 2) 
[1] 3.14 3.14 3.14 
> round(x, digits = 3) 
[1] 3.142 3.142 3.142 
> round(x, digits = 3) 
[1] 3.142 3.142 3.142 
> round(x, digits = 4) 
[1] 3.1416 3.1416 3.1416 
> round(x, digits = 5) 
[1] 3.14159 3.14159 3.14159 
> round(x, digits = 6) 
[1] 3.141593 3.141593 3.141593 
> round(x, digits = 7) 
[1] 3.141593 3.141593 3.141593 

Ich überprüft Objektklasse und Struktur und scheint das gleiche.

Was geht hier vor?

+4

In 'round()', 'digits' gibt die Anzahl der Dezimalstellen, nicht die Anzahl der signifikanten Stellen. (Verwenden Sie 'signif()' für das letztere.) Ihre Beispiele zeigen, dass es genau das tut. Wenn Sie Zahlen drucken, wird außerdem nur eine begrenzte Anzahl von Ziffern gedruckt. Daher erhalten Sie beim Runden von '234234.3456789' nicht mehr als eine Dezimalstelle. Verwenden Sie 'options (digits = 15)', um mehr Ziffern zu drucken. – Stibu

+0

Die zweite Antwort in Ihrem Link hat die genaue Lösung hier –

Antwort

1

Eigentlich round richtig funktioniert:

a <- round(x = 234234.3456789, digits = 7) 
paste(a) 
[1] "234234.3456789" 

In Ihrem Beispiel print.default, das ist das, was passiert, wenn man R print etwas fragen wird, um die Anzahl der Stellen zu schneiden.

print.default(a, digits = 15) 
[1] 234234.3456789 

Sie die behavoiour steuern kann über options

options(digits = 15) 
round(pi, digits = 15) 
[1] 3.14159265358979 
+1

Nun, Stibus Kommentar war viel schneller ... – Jav