Redondear desde .5
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)
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
}
x
es el objeto que desea redondear y digits
es 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)
).
Si quieres algo que se comporte exactamente igual round
excepto 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