Múltiples condiciones (descansos) para la función de corte
Tengo el siguiente marco de datos:
df <- as_tibble(c(15:-15))
Ahora quiero agregar intervalos en una nueva columna. Los intervalos deberían ser así:
df$Intervall <- cut(df$value, seq(from = -15, to = 15, by = 5), include.lowest=TRUE)
value Intervall
1 15 (10,15]
2 14 (10,15]
3 13 (10,15]
4 12 (10,15]
5 11 (10,15]
6 10 (5,10]
7 9 (5,10]
8 8 (5,10]
9 7 (5,10]
10 6 (5,10]
11 5 (0,5]
12 4 (0,5]
13 3 (0,5]
14 2 (0,5]
15 1 (0,5]
16 0 (-5,0]
17 -1 (-5,0]
18 -2 (-5,0]
19 -3 (-5,0]
20 -4 (-5,0]
21 -5 (-10,-5]
22 -6 (-10,-5]
23 -7 (-10,-5]
24 -8 (-10,-5]
25 -9 (-10,-5]
26 -10 [-15,-10]
27 -11 [-15,-10]
28 -12 [-15,-10]
29 -13 [-15,-10]
30 -14 [-15,-10]
31 -15 [-15,-10]
El resultado tiene el problema, que todos los ceros (0) en valor van al intervalo -0: -5 lo que hace que pierda simetría entre valores positivos y negativos. 5 es el intervalo 0,5 pero -5 es el intervalo -10: -5.
Quiero que cada 0 sea un intervalo de 0 o 0: 0, por lo que tengo simetría y -5 es el intervalo 0: -5.
El resultado debería verse así:
value Intervall
1 15 (10,15]
2 14 (10,15]
3 13 (10,15]
4 12 (10,15]
5 11 (10,15]
6 10 (5,10]
7 9 (5,10]
8 8 (5,10]
9 7 (5,10]
10 6 (5,10]
11 5 (0,5]
12 4 (0,5]
13 3 (0,5]
14 2 (0,5]
15 1 (0,5]
16 0 (0,0]
17 -1 (-5,0]
18 -2 (-5,0]
19 -3 (-5,0]
20 -4 (-5,0]
21 -5 (-5,0]
22 -6 (-10,-5]
23 -7 (-10,-5]
24 -8 (-10,-5]
25 -9 (-10,-5]
26 -10 (-10,-5]
27 -11 [-15,-10]
28 -12 [-15,-10]
29 -13 [-15,-10]
30 -14 [-15,-10]
31 -15 [-15,-10]
La solución jay.sf funciona para este pequeño marco de datos de muestra. No es práctico para mi marco de datos real, que es más grande. Así que realmente quiero cortar y agregar excepciones en lugar de hacerlo a mano. Sin embargo, no estoy seguro de cómo es posible.
Respuestas
Mabe restar y sumar 0.5 alrededor de 0 podría ser útil para usted.
cut(15:-15, c(seq(-15,0,5) - 0.5, 0.5 + seq(0,15,5)))
# [1] (10.5,15.5] (10.5,15.5] (10.5,15.5] (10.5,15.5] (10.5,15.5]
# [6] (5.5,10.5] (5.5,10.5] (5.5,10.5] (5.5,10.5] (5.5,10.5]
#[11] (0.5,5.5] (0.5,5.5] (0.5,5.5] (0.5,5.5] (0.5,5.5]
#[16] (-0.5,0.5] (-5.5,-0.5] (-5.5,-0.5] (-5.5,-0.5] (-5.5,-0.5]
#[21] (-5.5,-0.5] (-10.5,-5.5] (-10.5,-5.5] (-10.5,-5.5] (-10.5,-5.5]
#[26] (-10.5,-5.5] (-15.5,-10.5] (-15.5,-10.5] (-15.5,-10.5] (-15.5,-10.5]
#[31] (-15.5,-10.5]
#7 Levels: (-15.5,-10.5] (-10.5,-5.5] (-5.5,-0.5] (-0.5,0.5] ... (10.5,15.5]
Se puede usar un truco y corte ligeramente por debajo y por encima de cero, por ejemplo, -0.1y 0.1, y definir la costumbre labels=.
data.frame(x, interval=cut(x, c(-15.1, -10.1, -5.1, -.1, -.1, 5, 10, 15),
labels=c("[-15,-10)", "[-10,-5)", "[-5,-1]", "0", "[1,5]",
"(5,10]", "(10,15]"), include.lowest=T))
# x interval
# 1 15 (10,15]
# 2 14 (10,15]
# 3 13 (10,15]
# 4 12 (10,15]
# 5 11 (10,15]
# 6 10 (5,10]
# 7 9 (5,10]
# 8 8 (5,10]
# 9 7 (5,10]
# 10 6 (5,10]
# 11 5 [1,5]
# 12 4 [1,5]
# 13 3 [1,5]
# 14 2 [1,5]
# 15 1 [1,5]
# 16 0 0
# 17 -1 [-5,-1]
# 18 -2 [-5,-1]
# 19 -3 [-5,-1]
# 20 -4 [-5,-1]
# 21 -5 [-5,-1]
# 22 -6 [-10,-5)
# 23 -7 [-10,-5)
# 24 -8 [-10,-5)
# 25 -9 [-10,-5)
# 26 -10 [-10,-5)
# 27 -11 [-15,-10)
# 28 -12 [-15,-10)
# 29 -13 [-15,-10)
# 30 -14 [-15,-10)
# 31 -15 [-15,-10)
Datos:
x <- 15:-15