mtext ggplot change r rounding

ggplot - plot title r



redondo pero.5 debe ser derribado (5)

Desde la función de ayuda R: tenga en cuenta que para redondear un 5, se espera que se utilice el estándar IEC 60559, ''ir al dígito par''. Por lo tanto, la round(0.5) es 0 y la round(-1.5) es -2.

> round(0.5) [1] 0 > round(1.5) [1] 2 > round(2.5) [1] 2 > round(3.5) [1] 4 > round(4.5) [1] 4

Pero necesito que todos los valores que terminan con .5 se redondeen. Todos los demás valores deben redondearse, ya que se realizan mediante la función round (). Ejemplo:

round(3.5) = 3 round(8.6) = 9 round(8.1) = 8 round(4.5) = 4

¿Hay una manera rápida de hacerlo?


Esta función funciona al encontrar elementos que tienen una parte decimal igual a 0.5 , y agregarles un pequeño número negativo antes de redondear, asegurando que se redondearán hacia abajo. (Se basa, de manera inofensiva pero de manera poco confusa, en el hecho de que un vector booleano en R se convertirá en un vector de 0 ''s y 1 '' s cuando se multiplique por un vector numérico.)

f <- function(x) { round(x - .1*(x%%1 == .5)) } x <- c(0.5,1,1.5,2,2.5,2.01,2.99) f(x) [1] 0 1 1 2 2 2 3


La función (no jugó al golf) es muy simple y verifica si los decimales que quedan son .5 o menos. En efecto, podría fácilmente hacer que sea más útil y tomar 0.5 como argumento:

nice.round <- function(x, myLimit = 0.5) { bX <- x intX <- as.integer(x) decimals <- x%%intX if(is.na(decimals)) { decimals <- 0 } if(decimals <= myLimit) { x <- floor(x) } else { x <- round(x) } if (bX > 0.5 & bX < 1) { x <- 1 } return(x) }

Pruebas

Actualmente, esta función no funciona correctamente con valores entre 0.5 y 1.0.

> nice.round(1.5) [1] 1 > nice.round(1.6) [1] 2 > nice.round(10000.624541) [1] 10001 > nice.round(0.4) [1] 0 > nice.round(0.6) [1] 1


Me uniré al circo también:

rndflr <- function(x) { sel <- vapply(x - floor(x), function(y) isTRUE(all.equal(y, 0.5)), FUN.VALUE=logical(1)) x[sel] <- floor(x[sel]) x[!sel] <- round(x[!sel]) x } rndflr(c(3.5,8.6,8.1,4.5)) #[1] 3 9 8 4


Según el comentario de Dietrich Epp, puede utilizar la función ceiling() con un desplazamiento para obtener una solución rápida, vectorizada y correcta:

round_down <- function(x) ceiling(x - 0.5) round_down(seq(-2, 3, by = 0.5)) ## [1] -2 -2 -1 -1 0 0 1 1 2 2 3

Creo que esto es más rápido y mucho más simple que muchas de las otras soluciones que se muestran aquí.

Como señaló Carl Witthoft, esto agrega mucho más sesgo a sus datos que un simple redondeo. Comparar:

mean(round_down(seq(-2, 3, by = 0.5))) ## [1] 0.2727273 mean(round(seq(-2, 3, by = 0.5))) ## [1] 0.4545455 mean(seq(-2, 3, by = 0.5)) ## [1] 0.5

¿Cuál es la aplicación para tal procedimiento de redondeo?


Verifique si el resto de x %% 1 es igual a .5 y luego reduzca o redondee los números:

x <- seq(1, 3, 0.1) ifelse(x %% 1 == 0.5, floor(x), round(x)) > 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3