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

  • 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
    
  • dplyr
  • 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

Nube de datos