Redondear desde .5

Resuelto jakob-r asked hace 54 años • 8 respuestas

Sí, sé por qué siempre redondeamos al número par más cercano si estamos exactamente en el medio (es decir, 2,5 se convierte en 2) de dos números. Pero cuando quiero evaluar datos de algunas personas, no quieren este comportamiento. ¿Cuál es el método más sencillo para conseguir esto?

x <- seq(0.5,9.5,by=1)
round(x)

ser 1,2,3,...,10 y no 0,2,2,4,4,...,10.

Editar: Para aclarar: 1,4999 debe ser 1 después del redondeo. (Pensé que esto sería obvio)

jakob-r avatar Jan 01 '70 08:01 jakob-r
Aceptado

Esta no es mi propia función y, desafortunadamente, no puedo encontrar dónde la obtuve en este momento (se encontró originalmente como un comentario anónimo en el blog Statistically Significant ), pero debería ayudar con lo que necesita.

round2 = function(x, digits) {
  posneg = sign(x)
  z = abs(x)*10^digits
  z = z + 0.5 + sqrt(.Machine$double.eps)
  z = trunc(z)
  z = z/10^digits
  z*posneg
}

xes el objeto que desea redondear y digitses el número de dígitos al que está redondeando.

Un ejemplo

x = c(1.85, 1.54, 1.65, 1.85, 1.84)
round(x, 1)
# [1] 1.8 1.5 1.6 1.8 1.8
round2(x, 1)
# [1] 1.9 1.5 1.7 1.9 1.8

(Gracias @Gregor por agregar + sqrt(.Machine$double.eps)).

A5C1D2H2I1M1N2O1R2T1 avatar Oct 02 '2012 10:10 A5C1D2H2I1M1N2O1R2T1

Si quieres algo que se comporte exactamente igual roundexcepto por esos valores xxx.5, prueba esto:

x <- seq(0, 1, 0.1)
x
# [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
floor(0.5 + x)
# [1] 0 0 0 0 0 1 1 1 1 1 1
flodel avatar Oct 02 '2012 10:10 flodel