Mostrando entradas con la etiqueta ave. Mostrar todas las entradas
Mostrando entradas con la etiqueta ave. Mostrar todas las entradas

2016-05-30

Añadir una columna con el min y max por grupo en R

Title

Problema

Deseamos añadir dos columnas con el mínimo y máximo de la columna old.var para cada grupo de la columna id: 1, 2 y 3.

  id old.var
1  1       1
2  1       2
3  1       3
4  2       5
5  2       7
6  2       9
7  2      11
8  3       3
9  3       4

  • Datos originales
  • df <- structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L), old.var = c(1L, 
    2L, 3L, 5L, 7L, 9L, 11L, 3L, 4L)), .Names = c("id", "old.var"
    ), class = "data.frame", row.names = c(NA, -9L))
    

    Solución

  • Paquete base
  • df$min.var <- ave(df$old.var, df$id, FUN = min)
    df$max.var <- ave(df$old.var, df$id, FUN = max)
    
  • Paquete dplyr
  • library(dplyr)
    df %>% 
      group_by(id) %>%
      mutate(min.var = min(old.var), max.var = max(old.var))
    
      id old.var min.var max.var
    1  1       1       1       3
    2  1       2       1       3
    3  1       3       1       3
    4  2       5       5      11
    5  2       7       5      11
    6  2       9       5      11
    7  2      11       5      11
    8  3       3       3       4
    9  3       4       3       4
    

    Referencias

    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

    Nube de datos