Al agrupar los datos, lo que hacemos es convertir nuestra variable cuantitativa en un factor cuyos niveles son las clases en que ha sido dividida e identificamos cada dato con su clase.
A la hora de etiquetar los niveles, podemos elegir 3 codificaciones:
Esta función es básica en R para agrupar un vector de datos numéricos y codificar sus valores con lcases a las que pertenecen.
Su sintaxis básica es:
cut(x, breaks = ..., labels = ..., right = ...)
x es el vector numérico, nuestra variable cuantitativabreaks puede ser un vector numérico formado por los extremos de los intervalos en los que queremos agrupar nuestros datos y que habremos calculado previamente. También puede ser un número \(k\), en cuyo caso R agrupa los datos en \(k\) clases. Para este caso, R divide el intervalo comprendido entre los valores mínimo y máximo de \(x\) en \(k\) intervalos y, a continuación, desplaza ligeramente el extremo inferior del primer intervalo a la izquierda y el extremo del último, a la derecha.labels es un vector con las etiquetas de los intervalos. Su valor por defecto es utilizar la etiqueta de los mismos intervalos. Si especificamos labels = FALSE, obtendremos los intervalos etiquetados por medio de los números naturales correlativos (el primero es 1, el segundo es 2, etc.). Para utilizar como etiqueta las marcas de claseo cualquier otra codificación, hay que entrarlo como valor de este parámetro.right es un parámetro que por defecto está igualado a FALSE hace que los intervalos que consideremos sean cerrados por la izquierda y abiertos por la derecha. Este no es su valor por defecto, hay que colocarlo siempre para ser coherentes en teoría de probabilidades.include.lowest igualado a TRUE combinado con right = FALSE hace que el último intervalo sea cerrado. Puede sernos útil en algunos casos.En cualquier caso, el resultado de la función cut es una lista con los elementos del vector original codificados con las etiquetas de las clases a las que pertenecen. Bien sea un factor o un vector.
pl = iris$Petal.Length
cut(pl, breaks = nclass.FD(pl))
## [1] (0.994,2.18] (0.994,2.18] (0.994,2.18] (0.994,2.18] (0.994,2.18]
## [6] (0.994,2.18] (0.994,2.18] (0.994,2.18] (0.994,2.18] (0.994,2.18]
## [11] (0.994,2.18] (0.994,2.18] (0.994,2.18] (0.994,2.18] (0.994,2.18]
## [16] (0.994,2.18] (0.994,2.18] (0.994,2.18] (0.994,2.18] (0.994,2.18]
## [21] (0.994,2.18] (0.994,2.18] (0.994,2.18] (0.994,2.18] (0.994,2.18]
## [26] (0.994,2.18] (0.994,2.18] (0.994,2.18] (0.994,2.18] (0.994,2.18]
## [31] (0.994,2.18] (0.994,2.18] (0.994,2.18] (0.994,2.18] (0.994,2.18]
## [36] (0.994,2.18] (0.994,2.18] (0.994,2.18] (0.994,2.18] (0.994,2.18]
## [41] (0.994,2.18] (0.994,2.18] (0.994,2.18] (0.994,2.18] (0.994,2.18]
## [46] (0.994,2.18] (0.994,2.18] (0.994,2.18] (0.994,2.18] (0.994,2.18]
## [51] (4.54,5.72] (3.36,4.54] (4.54,5.72] (3.36,4.54] (4.54,5.72]
## [56] (3.36,4.54] (4.54,5.72] (2.18,3.36] (4.54,5.72] (3.36,4.54]
## [61] (3.36,4.54] (3.36,4.54] (3.36,4.54] (4.54,5.72] (3.36,4.54]
## [66] (3.36,4.54] (3.36,4.54] (3.36,4.54] (3.36,4.54] (3.36,4.54]
## [71] (4.54,5.72] (3.36,4.54] (4.54,5.72] (4.54,5.72] (3.36,4.54]
## [76] (3.36,4.54] (4.54,5.72] (4.54,5.72] (3.36,4.54] (3.36,4.54]
## [81] (3.36,4.54] (3.36,4.54] (3.36,4.54] (4.54,5.72] (3.36,4.54]
## [86] (3.36,4.54] (4.54,5.72] (3.36,4.54] (3.36,4.54] (3.36,4.54]
## [91] (3.36,4.54] (4.54,5.72] (3.36,4.54] (2.18,3.36] (3.36,4.54]
## [96] (3.36,4.54] (3.36,4.54] (3.36,4.54] (2.18,3.36] (3.36,4.54]
## [101] (5.72,6.91] (4.54,5.72] (5.72,6.91] (4.54,5.72] (5.72,6.91]
## [106] (5.72,6.91] (3.36,4.54] (5.72,6.91] (5.72,6.91] (5.72,6.91]
## [111] (4.54,5.72] (4.54,5.72] (4.54,5.72] (4.54,5.72] (4.54,5.72]
## [116] (4.54,5.72] (4.54,5.72] (5.72,6.91] (5.72,6.91] (4.54,5.72]
## [121] (4.54,5.72] (4.54,5.72] (5.72,6.91] (4.54,5.72] (4.54,5.72]
## [126] (5.72,6.91] (4.54,5.72] (4.54,5.72] (4.54,5.72] (5.72,6.91]
## [131] (5.72,6.91] (5.72,6.91] (4.54,5.72] (4.54,5.72] (4.54,5.72]
## [136] (5.72,6.91] (4.54,5.72] (4.54,5.72] (4.54,5.72] (4.54,5.72]
## [141] (4.54,5.72] (4.54,5.72] (4.54,5.72] (5.72,6.91] (4.54,5.72]
## [146] (4.54,5.72] (4.54,5.72] (4.54,5.72] (4.54,5.72] (4.54,5.72]
## Levels: (0.994,2.18] (2.18,3.36] (3.36,4.54] (4.54,5.72] (5.72,6.91]
Observese que tenemos 5 niveles, correspondientes a nclass.FD(pl) = 5, también vease que están girados (contrario a la teoría de probabilidad)
cut(pl, breaks = nclass.FD(pl),
right = FALSE)
## [1] [0.994,2.18) [0.994,2.18) [0.994,2.18) [0.994,2.18) [0.994,2.18)
## [6] [0.994,2.18) [0.994,2.18) [0.994,2.18) [0.994,2.18) [0.994,2.18)
## [11] [0.994,2.18) [0.994,2.18) [0.994,2.18) [0.994,2.18) [0.994,2.18)
## [16] [0.994,2.18) [0.994,2.18) [0.994,2.18) [0.994,2.18) [0.994,2.18)
## [21] [0.994,2.18) [0.994,2.18) [0.994,2.18) [0.994,2.18) [0.994,2.18)
## [26] [0.994,2.18) [0.994,2.18) [0.994,2.18) [0.994,2.18) [0.994,2.18)
## [31] [0.994,2.18) [0.994,2.18) [0.994,2.18) [0.994,2.18) [0.994,2.18)
## [36] [0.994,2.18) [0.994,2.18) [0.994,2.18) [0.994,2.18) [0.994,2.18)
## [41] [0.994,2.18) [0.994,2.18) [0.994,2.18) [0.994,2.18) [0.994,2.18)
## [46] [0.994,2.18) [0.994,2.18) [0.994,2.18) [0.994,2.18) [0.994,2.18)
## [51] [4.54,5.72) [3.36,4.54) [4.54,5.72) [3.36,4.54) [4.54,5.72)
## [56] [3.36,4.54) [4.54,5.72) [2.18,3.36) [4.54,5.72) [3.36,4.54)
## [61] [3.36,4.54) [3.36,4.54) [3.36,4.54) [4.54,5.72) [3.36,4.54)
## [66] [3.36,4.54) [3.36,4.54) [3.36,4.54) [3.36,4.54) [3.36,4.54)
## [71] [4.54,5.72) [3.36,4.54) [4.54,5.72) [4.54,5.72) [3.36,4.54)
## [76] [3.36,4.54) [4.54,5.72) [4.54,5.72) [3.36,4.54) [3.36,4.54)
## [81] [3.36,4.54) [3.36,4.54) [3.36,4.54) [4.54,5.72) [3.36,4.54)
## [86] [3.36,4.54) [4.54,5.72) [3.36,4.54) [3.36,4.54) [3.36,4.54)
## [91] [3.36,4.54) [4.54,5.72) [3.36,4.54) [2.18,3.36) [3.36,4.54)
## [96] [3.36,4.54) [3.36,4.54) [3.36,4.54) [2.18,3.36) [3.36,4.54)
## [101] [5.72,6.91) [4.54,5.72) [5.72,6.91) [4.54,5.72) [5.72,6.91)
## [106] [5.72,6.91) [3.36,4.54) [5.72,6.91) [5.72,6.91) [5.72,6.91)
## [111] [4.54,5.72) [4.54,5.72) [4.54,5.72) [4.54,5.72) [4.54,5.72)
## [116] [4.54,5.72) [4.54,5.72) [5.72,6.91) [5.72,6.91) [4.54,5.72)
## [121] [4.54,5.72) [4.54,5.72) [5.72,6.91) [4.54,5.72) [4.54,5.72)
## [126] [5.72,6.91) [4.54,5.72) [4.54,5.72) [4.54,5.72) [5.72,6.91)
## [131] [5.72,6.91) [5.72,6.91) [4.54,5.72) [4.54,5.72) [4.54,5.72)
## [136] [5.72,6.91) [4.54,5.72) [4.54,5.72) [4.54,5.72) [4.54,5.72)
## [141] [4.54,5.72) [4.54,5.72) [4.54,5.72) [5.72,6.91) [4.54,5.72)
## [146] [4.54,5.72) [4.54,5.72) [4.54,5.72) [4.54,5.72) [4.54,5.72)
## Levels: [0.994,2.18) [2.18,3.36) [3.36,4.54) [4.54,5.72) [5.72,6.91)
Ahora están correctamente cerrados a la izquierda y abiertos por la derecha. Aquí se aprecia cómo todos los límites de los intervalos aparecen con dos decimales exactos excepto el primero que correspondería al intervalo cerrado de 1, pero es ligeramente menor para no arrojar errores de sintaxis al existir como intervalo abierto.
cut(pl, breaks = ceiling(sqrt(length(pl))),
right = FALSE)
## [1] [0.994,1.45) [0.994,1.45) [0.994,1.45) [1.45,1.91) [0.994,1.45)
## [6] [1.45,1.91) [0.994,1.45) [1.45,1.91) [0.994,1.45) [1.45,1.91)
## [11] [1.45,1.91) [1.45,1.91) [0.994,1.45) [0.994,1.45) [0.994,1.45)
## [16] [1.45,1.91) [0.994,1.45) [0.994,1.45) [1.45,1.91) [1.45,1.91)
## [21] [1.45,1.91) [1.45,1.91) [0.994,1.45) [1.45,1.91) [1.45,1.91)
## [26] [1.45,1.91) [1.45,1.91) [1.45,1.91) [0.994,1.45) [1.45,1.91)
## [31] [1.45,1.91) [1.45,1.91) [1.45,1.91) [0.994,1.45) [1.45,1.91)
## [36] [0.994,1.45) [0.994,1.45) [0.994,1.45) [0.994,1.45) [1.45,1.91)
## [41] [0.994,1.45) [0.994,1.45) [0.994,1.45) [1.45,1.91) [1.45,1.91)
## [46] [0.994,1.45) [1.45,1.91) [0.994,1.45) [1.45,1.91) [0.994,1.45)
## [51] [4.63,5.08) [4.18,4.63) [4.63,5.08) [3.72,4.18) [4.18,4.63)
## [56] [4.18,4.63) [4.63,5.08) [3.27,3.72) [4.18,4.63) [3.72,4.18)
## [61] [3.27,3.72) [4.18,4.63) [3.72,4.18) [4.63,5.08) [3.27,3.72)
## [66] [4.18,4.63) [4.18,4.63) [3.72,4.18) [4.18,4.63) [3.72,4.18)
## [71] [4.63,5.08) [3.72,4.18) [4.63,5.08) [4.63,5.08) [4.18,4.63)
## [76] [4.18,4.63) [4.63,5.08) [4.63,5.08) [4.18,4.63) [3.27,3.72)
## [81] [3.72,4.18) [3.27,3.72) [3.72,4.18) [5.08,5.54) [4.18,4.63)
## [86] [4.18,4.63) [4.63,5.08) [4.18,4.63) [3.72,4.18) [3.72,4.18)
## [91] [4.18,4.63) [4.18,4.63) [3.72,4.18) [3.27,3.72) [4.18,4.63)
## [96] [4.18,4.63) [4.18,4.63) [4.18,4.63) [2.82,3.27) [3.72,4.18)
## [101] [5.99,6.45) [5.08,5.54) [5.54,5.99) [5.54,5.99) [5.54,5.99)
## [106] [6.45,6.91) [4.18,4.63) [5.99,6.45) [5.54,5.99) [5.99,6.45)
## [111] [5.08,5.54) [5.08,5.54) [5.08,5.54) [4.63,5.08) [5.08,5.54)
## [116] [5.08,5.54) [5.08,5.54) [6.45,6.91) [6.45,6.91) [4.63,5.08)
## [121] [5.54,5.99) [4.63,5.08) [6.45,6.91) [4.63,5.08) [5.54,5.99)
## [126] [5.99,6.45) [4.63,5.08) [4.63,5.08) [5.54,5.99) [5.54,5.99)
## [131] [5.99,6.45) [5.99,6.45) [5.54,5.99) [5.08,5.54) [5.54,5.99)
## [136] [5.99,6.45) [5.54,5.99) [5.08,5.54) [4.63,5.08) [5.08,5.54)
## [141] [5.54,5.99) [5.08,5.54) [5.08,5.54) [5.54,5.99) [5.54,5.99)
## [146] [5.08,5.54) [4.63,5.08) [5.08,5.54) [5.08,5.54) [5.08,5.54)
## 13 Levels: [0.994,1.45) [1.45,1.91) [1.91,2.36) [2.36,2.82) ... [6.45,6.91)
Con este regla se dividen ahora en 13 intervalos.
cut(pl, breaks = c(1,2,3,4,5,6,7),
right = FALSE)
## [1] [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2)
## [13] [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2)
## [25] [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2)
## [37] [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2) [1,2)
## [49] [1,2) [1,2) [4,5) [4,5) [4,5) [4,5) [4,5) [4,5) [4,5) [3,4) [4,5) [3,4)
## [61] [3,4) [4,5) [4,5) [4,5) [3,4) [4,5) [4,5) [4,5) [4,5) [3,4) [4,5) [4,5)
## [73] [4,5) [4,5) [4,5) [4,5) [4,5) [5,6) [4,5) [3,4) [3,4) [3,4) [3,4) [5,6)
## [85] [4,5) [4,5) [4,5) [4,5) [4,5) [4,5) [4,5) [4,5) [4,5) [3,4) [4,5) [4,5)
## [97] [4,5) [4,5) [3,4) [4,5) [6,7) [5,6) [5,6) [5,6) [5,6) [6,7) [4,5) [6,7)
## [109] [5,6) [6,7) [5,6) [5,6) [5,6) [5,6) [5,6) [5,6) [5,6) [6,7) [6,7) [5,6)
## [121] [5,6) [4,5) [6,7) [4,5) [5,6) [6,7) [4,5) [4,5) [5,6) [5,6) [6,7) [6,7)
## [133] [5,6) [5,6) [5,6) [6,7) [5,6) [5,6) [4,5) [5,6) [5,6) [5,6) [5,6) [5,6)
## [145] [5,6) [5,6) [5,6) [5,6) [5,6) [5,6)
## Levels: [1,2) [2,3) [3,4) [4,5) [5,6) [6,7)
Ahora se están dividiendo de 1 a 2, 2 a 3…
Podemos también especificar las etiquetas o en este caso al igualar a FALSE solicitar que se ordenen con números naturales.
cut(pl, breaks = nclass.FD(pl),
right = FALSE,
labels = FALSE)
## [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## [38] 1 1 1 1 1 1 1 1 1 1 1 1 1 4 3 4 3 4 3 4 2 4 3 3 3 3 4 3 3 3 3 3 3 4 3 4 4
## [75] 3 3 4 4 3 3 3 3 3 4 3 3 4 3 3 3 3 4 3 2 3 3 3 3 2 3 5 4 5 4 5 5 3 5 5 5 4
## [112] 4 4 4 4 4 4 5 5 4 4 4 5 4 4 5 4 4 4 5 5 5 4 4 4 5 4 4 4 4 4 4 4 5 4 4 4 4
## [149] 4 4
Ahora podemos dar nombres específicos a las etiquetas.
cut(pl, breaks = nclass.FD(pl),
right = FALSE,
labels = c("Muy pequeñas",
"Pequeñas",
"Medianas",
"Grandes",
"Muy grandes"))
## [1] Muy pequeñas Muy pequeñas Muy pequeñas Muy pequeñas Muy pequeñas
## [6] Muy pequeñas Muy pequeñas Muy pequeñas Muy pequeñas Muy pequeñas
## [11] Muy pequeñas Muy pequeñas Muy pequeñas Muy pequeñas Muy pequeñas
## [16] Muy pequeñas Muy pequeñas Muy pequeñas Muy pequeñas Muy pequeñas
## [21] Muy pequeñas Muy pequeñas Muy pequeñas Muy pequeñas Muy pequeñas
## [26] Muy pequeñas Muy pequeñas Muy pequeñas Muy pequeñas Muy pequeñas
## [31] Muy pequeñas Muy pequeñas Muy pequeñas Muy pequeñas Muy pequeñas
## [36] Muy pequeñas Muy pequeñas Muy pequeñas Muy pequeñas Muy pequeñas
## [41] Muy pequeñas Muy pequeñas Muy pequeñas Muy pequeñas Muy pequeñas
## [46] Muy pequeñas Muy pequeñas Muy pequeñas Muy pequeñas Muy pequeñas
## [51] Grandes Medianas Grandes Medianas Grandes
## [56] Medianas Grandes Pequeñas Grandes Medianas
## [61] Medianas Medianas Medianas Grandes Medianas
## [66] Medianas Medianas Medianas Medianas Medianas
## [71] Grandes Medianas Grandes Grandes Medianas
## [76] Medianas Grandes Grandes Medianas Medianas
## [81] Medianas Medianas Medianas Grandes Medianas
## [86] Medianas Grandes Medianas Medianas Medianas
## [91] Medianas Grandes Medianas Pequeñas Medianas
## [96] Medianas Medianas Medianas Pequeñas Medianas
## [101] Muy grandes Grandes Muy grandes Grandes Muy grandes
## [106] Muy grandes Medianas Muy grandes Muy grandes Muy grandes
## [111] Grandes Grandes Grandes Grandes Grandes
## [116] Grandes Grandes Muy grandes Muy grandes Grandes
## [121] Grandes Grandes Muy grandes Grandes Grandes
## [126] Muy grandes Grandes Grandes Grandes Muy grandes
## [131] Muy grandes Muy grandes Grandes Grandes Grandes
## [136] Muy grandes Grandes Grandes Grandes Grandes
## [141] Grandes Grandes Grandes Muy grandes Grandes
## [146] Grandes Grandes Grandes Grandes Grandes
## Levels: Muy pequeñas Pequeñas Medianas Grandes Muy grandes
Ahora se transforman en datos ordinales.
Algo que queda bien es colocar las divisiones en nuevas columnas del Data Frame.
iris_df = iris
iris_df$Length.cathegory = cut(pl, breaks = nclass.FD(pl),
right = FALSE,
labels = c("Muy pequeñas",
"Pequeñas",
"Medianas",
"Grandes",
"Muy grandes"))
iris_df$Length.group = cut(pl, breaks = nclass.FD(pl),
right = FALSE)
head(iris_df)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species Length.cathegory
## 1 5.1 3.5 1.4 0.2 setosa Muy pequeñas
## 2 4.9 3.0 1.4 0.2 setosa Muy pequeñas
## 3 4.7 3.2 1.3 0.2 setosa Muy pequeñas
## 4 4.6 3.1 1.5 0.2 setosa Muy pequeñas
## 5 5.0 3.6 1.4 0.2 setosa Muy pequeñas
## 6 5.4 3.9 1.7 0.4 setosa Muy pequeñas
## Length.group
## 1 [0.994,2.18)
## 2 [0.994,2.18)
## 3 [0.994,2.18)
## 4 [0.994,2.18)
## 5 [0.994,2.18)
## 6 [0.994,2.18)