Agrupando datos con R

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:

La función cut

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 = ...)

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.

Ejemplo

Especificar el número de k clases

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.

Especificar las divisiones en lugar del número de clases

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)