Estoy escribiendo una función para trazar datos. Me gustaría especificar un buen número redondo para el eje y max
que sea mayor que el máximo del conjunto de datos.
Específicamente, me gustaría una función foo
que realice lo siguiente:
foo(4) == 5
foo(6.1) == 10 #maybe 7 would be better
foo(30.1) == 40
foo(100.1) == 110
He llegado tan lejos como
foo <- function(x) ceiling(max(x)/10)*10
para redondear a la decena más cercana, pero esto no funciona para intervalos de redondeo arbitrarios.
¿Hay una mejor manera de hacer esto en R?
?pretty
?foo(4)==5
y no10
?Respuestas:
Si solo desea redondear a la potencia más cercana de 10, simplemente defina:
En realidad, esto también funciona cuando x es un vector:
... pero si desea redondear a un número "agradable", primero debe definir qué es un número "agradable". Lo siguiente nos permite definir "agradable" como un vector con buenos valores base de 1 a 10. El valor predeterminado se establece en los números pares más 5.
Lo anterior no funciona cuando x es un vector, ya es demasiado tarde en la noche :)
[[EDITAR]]
Si la pregunta es cómo redondear a un valor específico más cercano (como 10 o 100), entonces la respuesta de James parece la más apropiada. Mi versión le permite tomar cualquier valor y redondearlo automáticamente a un valor razonablemente "agradable". Algunas otras buenas opciones del vector "agradable" anterior son:
1:10, c(1,5,10), seq(1, 10, 0.1)
Si tiene un rango de valores en su gráfico, por ejemplo
[3996.225, 40001.893]
, la forma automática debe tener en cuenta tanto el tamaño del rango como la magnitud de los números. Y como señaló Hadley , lapretty()
función podría ser la que desee.fuente
Vectorize(roundUpNice)
es bastante rápido =) +1 de todos modos.roundUpNice(501, nice=c(5, 10)) # 1000
x < 0
y lo aplicaría- x
en el registro antes de poner el-
reverso. También agregaría una excepción para la situación en la quex = 0
La
plyr
biblioteca tiene una funciónround_any
que es bastante genérica para hacer todo tipo de redondeo. Por ejemplofuente
dplyr
reemplazo, consulte: stackoverflow.com/a/46489816/435093La función de redondeo en R asigna un significado especial al parámetro de dígitos si es negativo.
Esto significa que una función como la siguiente se acerca bastante a lo que está pidiendo.
La salida se parece a la siguiente
fuente
Qué tal si:
Lo que da:
fuente
pretty
lo que probablemente sea la mejor opción.to * ceiling(x / to)
estaría más limpio?Si agrega un número negativo al argumento de dígitos de round (), R lo redondeará a los múltiplos de 10, 100, etc.
fuente
Redondea CUALQUIER número hacia arriba o hacia abajo a CUALQUIER intervalo
Puede redondear números fácilmente a un intervalo específico utilizando el operador de módulo
%%
.La función:
Ejemplos:
Cómo funciona:
El operador de módulo
%%
determina el resto de dividir el primer número por el segundo. Sumar o restar este intervalo a su número de interés esencialmente puede "redondear" el número a un intervalo de su elección.Actualizar:
La conveniente versión de 2 argumentos:
y
Valores positivosroundUp
, mientras quey
valores negativosroundDown
:O....
Función que redondea automáticamente hacia ARRIBA o ABAJO según las reglas de redondeo estándar:
Redondea automáticamente hacia arriba si el
x
valor se encuentra a>
medio camino entre instancias posteriores del valor de redondeoy
:fuente
Round
a VBA en 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
Con respecto al redondeo a la multiplicidad de un número arbitrario , por ejemplo, 10, aquí hay una alternativa simple a la respuesta de James.
Funciona para cualquier número real redondeado hacia arriba (
from
) y cualquier número real positivo redondeado hacia arriba (to
):Ejemplo:
fuente
Creo que tu código funciona muy bien con una pequeña modificación:
Y tus ejemplos corren:
Alteré tu función de dos maneras:
=1e-09
siéntase libre de modificar!) almax(x)
si desea un número mayorfuente
Si siempre desea redondear un número hasta el X más cercana, puede utilizar la
ceiling
función:De manera similar, si siempre desea redondear hacia abajo , use la
floor
función. Si desea simplemente redondear hacia arriba o hacia abajo a la Z más cercana, utiliceround
en su lugar.fuente
Encontrará una versión mejorada de la respuesta de Tommy que tiene en cuenta varios casos:
Debajo del código:
fuente
> round.up.nice(.01) [1] 0 > round.up.nice(4.5) [1] 0 > round.up.nice(56) [1] 50
nice_big
ynice_small
están definidos al revés, (si los volteamos en la función, seround.up.nice(4.5)
convierte4
) pero aún así se redondea hacia abajo.Intenté esto sin usar ninguna biblioteca externa o características crípticas y ¡funciona!
Espero que ayude a alguien.
fuente