Ich schreibe eine Funktion zum Zeichnen von Daten. Ich möchte eine schöne runde Zahl für die y-Achse angeben max
, die größer als das Maximum des Datensatzes ist.
Insbesondere möchte ich eine Funktion foo
, die Folgendes ausführt:
foo(4) == 5
foo(6.1) == 10 #maybe 7 would be better
foo(30.1) == 40
foo(100.1) == 110
Ich bin so weit gekommen
foo <- function(x) ceiling(max(x)/10)*10
zum Runden auf die nächsten 10, dies funktioniert jedoch nicht für beliebige Rundungsintervalle.
Gibt es einen besseren Weg, dies in R zu tun?
?pretty
?foo(4)==5
und nicht10
?Antworten:
Wenn Sie nur auf die nächste Potenz von 10 aufrunden möchten, definieren Sie einfach:
Dies funktioniert tatsächlich auch, wenn x ein Vektor ist:
..aber wenn Sie auf eine "schöne" Zahl runden möchten, müssen Sie zuerst definieren, was eine "schöne" Zahl ist. Im Folgenden können Sie "nice" als einen Vektor mit netten Basiswerten von 1 bis 10 definieren. Der Standardwert ist die geraden Zahlen plus 5.
Das obige funktioniert nicht, wenn x ein Vektor ist - momentan zu spät am Abend :)
[[BEARBEITEN]]
Wenn die Frage lautet, wie auf einen bestimmten nächsten Wert (wie 10 oder 100) gerundet werden soll, erscheint die Antwort von James am besten geeignet. In meiner Version können Sie einen beliebigen Wert nehmen und ihn automatisch auf einen einigermaßen "netten" Wert runden. Einige andere gute Möglichkeiten des obigen "schönen" Vektors sind:
1:10, c(1,5,10), seq(1, 10, 0.1)
Wenn Sie beispielsweise einen Wertebereich in Ihrem Diagramm haben,
[3996.225, 40001.893]
sollte der automatische Weg sowohl die Größe des Bereichs als auch die Größe der Zahlen berücksichtigen. Und wie Hadley bemerkt hat ,pretty()
könnte die Funktion genau das sein, was Sie wollen.quelle
Vectorize(roundUpNice)
ist ziemlich schnell =) +1 Wie auch immer.roundUpNice(501, nice=c(5, 10)) # 1000
x < 0
und- x
im Protokoll angewendet, bevor Sie den-
Rücken setzen. Ich würde auch eine Ausnahme für die Situation hinzufügen, in derx = 0
Die
plyr
Bibliothek hat eine Funktionround_any
, die ziemlich allgemein ist, um alle Arten von Rundungen durchzuführen. Beispielsweisequelle
dplyr
Ersatz finden Sie unter: stackoverflow.com/a/46489816/435093Die Rundungsfunktion in R weist dem Ziffernparameter eine besondere Bedeutung zu, wenn er negativ ist.
Dies bedeutet, dass eine Funktion wie die folgende dem , was Sie verlangen, ziemlich nahe kommt .
Die Ausgabe sieht wie folgt aus
quelle
Wie wäre es mit:
Welches gibt:
quelle
pretty
ist dies wahrscheinlich die beste Option.to * ceiling(x / to)
sauberer?Wenn Sie dem Ziffernargument von round () eine negative Zahl hinzufügen, rundet R diese auf die Vielfachen von 10, 100 usw.
quelle
Runden Sie JEDE Zahl nach oben / unten auf ein beliebiges Intervall
Mit dem Modulo-Operator können Sie Zahlen einfach auf ein bestimmtes Intervall runden
%%
.Die Funktion:
Beispiele:
Wie es funktioniert:
Der Modulo-Operator
%%
bestimmt den Rest der Division der ersten Zahl durch die zweite. Das Hinzufügen oder Subtrahieren dieses Intervalls zu Ihrer interessierenden Anzahl kann die Zahl im Wesentlichen auf ein Intervall Ihrer Wahl "runden".Aktualisieren:
Die praktische Version mit zwei Argumenten:
Positive
y
WerteroundUp
, während negativey
WerteroundDown
:Oder....
Funktion, die UP oder DOWN basierend auf Standardrundungsregeln automatisch rundet :
Rundet automatisch auf, wenn der
x
Wert>
zwischen den nachfolgenden Instanzen des Rundungswerts liegty
:quelle
Round
in Excel zu VBA konvertiert :Function ROUND(x,y) 'Function that automatically rounds UP or DOWN based on standard rounding rules. 'Automatically rounds up if the "x" value is > halfway between subsequent instances of the rounding value "y": If (y - (Evaluate("Mod(" & x & "," & y & ")"))) <= (Evaluate("Mod(" & x & "," & y & ")")) Then Ans = x + (y - (Evaluate("Mod(" & x & "," & y & ")"))) Else Ans = x - (Evaluate("Mod(" & x & "," & y & ")")) End If ROUND = Ans End Function
In Bezug auf die Aufrundung auf die Vielzahl einer beliebigen Zahl , z. B. 10, ist hier eine einfache Alternative zu James 'Antwort.
Es funktioniert für jede reelle Zahl, die aufgerundet wird (
from
) und jede echte positive Zahl, die auf (to
) aufgerundet wird :Beispiel:
quelle
Ich denke, Ihr Code funktioniert mit einer kleinen Modifikation einfach großartig:
Und Ihre Beispiele lauten:
Ich habe Ihre Funktion auf zwei Arten geändert:
=1e-09
können ihn gerne ändern!)max(x)
quelle
Wenn Sie immer eine Zahl runden möchten bis zur nächsten X, können Sie die Verwendung
ceiling
Funktion:Und falls Sie immer rund wollen nach unten , verwenden Sie die
floor
Funktion. Wenn Sie einfach auf das nächste Z auf- oder abrunden möchten, verwenden Sieround
stattdessen.quelle
Sie finden eine aktualisierte Version von Tommys Antwort , die mehrere Fälle berücksichtigt:
Unter dem Code:
quelle
> round.up.nice(.01) [1] 0 > round.up.nice(4.5) [1] 0 > round.up.nice(56) [1] 50
nice_big
undnice_small
rückwärts definiert werden (wenn wir sie in der Funktion umdrehen,round.up.nice(4.5)
wird4
), aber es rundet immer noch ab.Ich habe dies versucht, ohne eine externe Bibliothek oder kryptische Funktionen zu verwenden, und es funktioniert!
Hoffe es hilft jemandem.
quelle