2016-01-28

Ordenar un data frame por la frecuencia de una columna en R

Title

Problema

Tenemos el siguiente data frame. Y, sin agrupar, queremos ordenarlo de mayor a menor por la frecuencia de la columna Salary. Es decir, 1002 se repite tres veces en nuestro data frame, 1001 y 3001 dos veces y resto una vez.

   Region  ID Salary
1       1  A1    100
2       1  A2   1001
3       1  A3   2000
4       1  A4   2431
5       1  A5   1001
6       2  A6   1002
7       2  A7   1002
8       2  A8   1002
9       3  A9   3001
10      3 A10   3001
11      3 A11   4001
df <- structure(list(Region = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 
3L, 3L), ID = c("A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", 
"A9", "A10", "A11"), Salary = c(100L, 1001L, 2000L, 2431L, 1001L, 
1002L, 1002L, 1002L, 3001L, 3001L, 4001L)), .Names = c("Region", 
"ID", "Salary"), class = "data.frame", row.names = c(NA, -11L
))

Solución

Con transform creamos la columna frecuencia (freq) y después con order, ordenamos por ella. Por defecto es en orden ascendente al preceder la columna del signo menos, indicamos que sea en orden descendente.

df <- transform(df, freq = ave(seq(nrow(df)), Salary, FUN = length))
df[order(-df$freq), ]

Resultado

   Region  ID Salary freq
6       2  A6   1002    3
7       2  A7   1002    3
8       2  A8   1002    3
2       1  A2   1001    2
5       1  A5   1001    2
9       3  A9   3001    2
10      3 A10   3001    2
1       1  A1    100    1
3       1  A3   2000    1
4       1  A4   2431    1
11      3 A11   4001    1

Referencias

No hay comentarios:

Publicar un comentario

Nube de datos