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
- Paquete base 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), ]
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
library(dplyr)
df %>%
add_count(Salary) %>%
arrange(-n)
Region ID Salary n
1 2 A6 1002 3
2 2 A7 1002 3
3 2 A8 1002 3
4 1 A2 1001 2
5 1 A5 1001 2
6 3 A9 3001 2
7 3 A10 3001 2
8 1 A1 100 1
9 1 A3 2000 1
10 1 A4 2431 1
11 3 A11 4001 1
Referencias
No hay comentarios:
Publicar un comentario