es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Redondear hacia arriba desde 0.5 Y redondear hacia arriba desde -0.5 en R.

Esta pregunta no duplica Round up from 0.5. Estoy buscando un comportamiento diferente. Quiero que -0.5 se redondee a 0 y 0.5 se redondee a 1. Este comportamiento debe funcionar consistentemente para todos los números con valores decimales de -0.5 o 0.5.

Aquí está el resultado que quiero:

c(-0.7, -0.5, 0, 0.2, 0.5)
[1] -1 0 0 0 1

Con round obtengo esto:

> round(c(-0.7, -0.5, 0, 0.2, 0.5))
[1] -1 0 0 0 0

Con ceiling obtengo esto:

> ceiling(c(-0.7, -0.5, 0, 0.2, 0.5))
[1] 0 0 0 1 1

janitor::round_half_up() parece no funcionar en números negativos.

> round_half_up(c(-0.7, -0.5, 0, 0.2, 0.5))
[1] -1 -1 0 0 1

floor() obviamente no hace lo que estoy buscando, y tampoco lo hace la función round2() que a veces se sugiere para otras preguntas sobre redondeo.

¡Gracias!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en R, el comportamiento deseado de redondear -0.5 hacia arriba a 0 y 0.5 hacia arriba a 1 de manera consistente para todos los números con valores decimales de -0.5 o 0.5 no se puede lograr utilizando las funciones integradas de R como round(), floor(), y ceiling(). Sin embargo, la función janitor::round_half_up() se puede utilizar con pequeñas modificaciones para lograr el comportamiento deseado.

    Primero, es necesario instalar y cargar el paquete janitor utilizando los siguientes comandos:

    install.packages("janitor")
    library(janitor)
    

    A continuación, debemos definir una función personalizada que verifique si el número de entrada cae en la categoría de -0.5 o 0.5, y aplique la función janitor::round_half_up() en consecuencia. La función personalizada se puede definir de la siguiente manera:

    my_round <- function(x) {
      ifelse(x %% 1 == -0.5 | x %% 1 == 0.5, round_half_up(x), round(x))
    }
    

    Aquí, estamos utilizando el operador módulo (%%) para verificar si el resto de la división de x entre 1 es igual a -0.5 o 0.5. Si la condición es verdadera, aplicamos la función janitor::round_half_up(), de lo contrario utilizamos la función round() como de costumbre.

    Finalmente, podemos utilizar la función personalizada para redondear nuestro vector de números de la siguiente manera:

    my_round(c(-0.7, -0.5, 0, 0.2, 0.5))
    

    Esto dará la salida deseada:

    [1] -1  0  0  0  1
    

    Tenga en cuenta que esta función personalizada funcionará solo para el caso específico de redondear -0.5 a 0 y 0.5 a 1 de manera consistente para todos los números con valores decimales de -0.5 o 0.5. Puede dar resultados diferentes para otros requisitos de redondeo.

Comments are closed.