J'écris une fonction pour tracer des données. Je voudrais spécifier un joli nombre rond pour l'axe ymax
qui est supérieur au maximum de l'ensemble de données.
Plus précisément, je voudrais une fonction foo
qui effectue les opérations suivantes:
foo(4) == 5
foo(6.1) == 10 #maybe 7 would be better
foo(30.1) == 40
foo(100.1) == 110
Je suis allé aussi loin que
foo <- function(x) ceiling(max(x)/10)*10
pour arrondir à la dizaine la plus proche, mais cela ne fonctionne pas pour les intervalles d'arrondi arbitraires.
Y a-t-il une meilleure façon de faire cela dans R?
?pretty
?foo(4)==5
et non10
?Réponses:
Si vous souhaitez simplement arrondir à la puissance 10 la plus proche, définissez simplement:
Cela fonctionne également lorsque x est un vecteur:
..mais si vous voulez arrondir à un "joli" nombre, vous devez d'abord définir ce qu'est un "joli" nombre. Ce qui suit nous permet de définir «gentil» comme un vecteur avec de jolies valeurs de base de 1 à 10. La valeur par défaut est définie sur les nombres pairs plus 5.
Ce qui précède ne fonctionne pas lorsque x est un vecteur - trop tard dans la soirée en ce moment :)
[[ÉDITER]]
Si la question est de savoir comment arrondir à une valeur spécifiée la plus proche (comme 10 ou 100), alors la réponse de James semble la plus appropriée. Ma version vous permet de prendre n'importe quelle valeur et de l'arrondir automatiquement à une valeur raisonnablement "agréable". Voici quelques autres bons choix du "joli" vecteur ci-dessus:
1:10, c(1,5,10), seq(1, 10, 0.1)
Si vous avez une plage de valeurs dans votre tracé, par exemple,
[3996.225, 40001.893]
la méthode automatique doit prendre en compte à la fois la taille de la plage et l'amplitude des nombres. Et comme l'a noté Hadley , lapretty()
fonction peut être ce que vous voulez.la source
Vectorize(roundUpNice)
est assez rapide =) +1 Quoi qu'il en soit.roundUpNice(501, nice=c(5, 10)) # 1000
x < 0
et appliquer- x
dans le journal avant de remettre le-
dos. J'ajouterais également une exception pour la situation oùx = 0
La
plyr
bibliothèque a une fonctionround_any
assez générique pour effectuer toutes sortes d'arrondis. Par exemplela source
dplyr
remplacement, voir: stackoverflow.com/a/46489816/435093La fonction d'arrondi dans R attribue une signification spéciale au paramètre chiffres s'il est négatif.
Cela signifie qu'une fonction comme celle-ci est assez proche de ce que vous demandez.
La sortie ressemble à ce qui suit
la source
Que diriez-vous:
Qui donne:
la source
pretty
probablement la meilleure option.to * ceiling(x / to)
plus propre?Si vous ajoutez un nombre négatif à l'argument chiffres de round (), R l'arrondira aux multiples de 10, 100 etc.
la source
Arrondir N'IMPORTE QUEL nombre haut / bas à N'IMPORTE QUEL intervalle
Vous pouvez facilement arrondir les nombres à un intervalle spécifique à l'aide de l' opérateur modulo
%%
.La fonction:
Exemples:
Comment ça fonctionne:
L'opérateur modulo
%%
détermine le reste de la division du premier nombre par le deuxième. Ajouter ou soustraire cet intervalle à votre nombre d'intérêt peut essentiellement «arrondir» le nombre à un intervalle de votre choix.Mettre à jour:
La version pratique à 2 arguments:
y
Valeurs positivesroundUp
, tandis quey
valeurs négativesroundDown
:Ou....
Fonction qui arrondit automatiquement HAUT ou BAS selon les règles d'arrondi standard:
Arrondit automatiquement si la
x
valeur est à>
mi - chemin entre les instances suivantes de la valeur d'arrondiy
:la source
Round
en VBA dans Excel: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
En ce qui concerne l' arrondissement à la multiplicité d'un nombre arbitraire , par exemple 10, voici une alternative simple à la réponse de James.
Cela fonctionne pour tout nombre réel arrondi (
from
) et tout nombre réel positif arrondi à (to
):Exemple:
la source
Je pense que votre code fonctionne très bien avec une petite modification:
Et vos exemples courent:
J'ai modifié votre fonction de deux manières:
=1e-09
, n'hésitez pas à modifier!) à lamax(x)
si vous voulez un plus grand nombrela source
Si vous voulez toujours arrondir un nombre jusqu'à la plus proche X, vous pouvez utiliser la
ceiling
fonction:De même, si vous voulez toujours à arrondir vers le bas , utilisez la
floor
fonction. Si vous voulez simplement arrondir au Z le plus proche, utilisezround
plutôt.la source
Vous trouverez une version améliorée de la réponse de Tommy qui prend en compte plusieurs cas:
Sous le code:
la source
> round.up.nice(.01) [1] 0 > round.up.nice(4.5) [1] 0 > round.up.nice(56) [1] 50
nice_big
etnice_small
sont définis à l'envers, (si nous les retournons dans la fonction,round.up.nice(4.5)
devient4
) mais il s'arrondit toujours.J'ai essayé cela sans utiliser de bibliothèque externe ou de fonctionnalités cryptiques et cela fonctionne!
J'espère que ça aide quelqu'un.
la source