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

2018-03-06

Filtrar un data frame basado en intervalos de tiempo en R

Problema

Para cada una de las Species queremos quedarnos con la primera imagen (columna ID) de cada intervalo de una hora empezando por la fecha inicial: 2015-03-16 18:42:00. Es decir, para la Specie A, nos queremos quedar con P1, P3 y P4. P2 no la consideraríamos pues está dentro del intervalo de una hora a partir de P1, entre las 18:42 y las 19:41.

  ID Species            DateTime
1 P1       A 2015-03-16 18:42:00
2 P2       A 2015-03-16 19:34:00
3 P3       A 2015-03-16 19:58:00
4 P4       A 2015-03-16 21:02:00
5 P5       B 2015-03-16 21:18:00
6 P6       A 2015-03-16 21:19:00
7 P7       A 2015-03-16 21:33:00
8 P8       B 2015-03-16 21:35:00
9 P9       B 2015-03-16 23:43:00
  • Datos
df <- read.table(
  text = 'ID   Species       DateTime
  P1   A            "2015-03-16 18:42:00"
  P2   A             "2015-03-16 19:34:00"
  P3   A             "2015-03-16 19:58:00"
  P4   A             "2015-03-16 21:02:00"
  P5   B             "2015-03-16 21:18:00"
  P6   A             "2015-03-16 21:19:00"
  P7   A             "2015-03-16 21:33:00"
  P8   B             "2015-03-16 21:35:00"
  P9   B             "2015-03-16 23:43:00"',
  stringsAsFactors = FALSE,
  header = TRUE
)

Solución

Creamos una nueva columna con los intervalos cada 60 minutos y nos quedamos con la primera ocurrencia para cada una de las Species. Es importante señalar que dentro de la función cut tenemos que especificar 60 minutos y no una hora ("1 hour"), o de lo contrario el intervalo no tendría en cuenta los minutos sino solamente las horas. Es decir, comenzaría el primer intervalo a las 18:00 y no a las 18:42.

library(dplyr)
df$DateTime <- as.POSIXct(df$DateTime)
df %>%
  mutate(by60 = cut(DateTime, "60 min")) %>%
  group_by(Species, by60) %>%
  slice(1) %>%
  ungroup() %>%
  select(-by60)

Resultados

# A tibble: 5 x 3
  ID    Species DateTime           
                   
1 P1    A       2015-03-16 18:42:00
2 P3    A       2015-03-16 19:58:00
3 P4    A       2015-03-16 21:02:00
4 P5    B       2015-03-16 21:18:00
5 P9    B       2015-03-16 23:43:00

Referencias

2015-09-03

Seleccionar un porcentaje de filas un data frame en R

Title

Problema

Queremos seleccionar un porcentajes de filas de un data frame.

Soluciones

Utilizamos el conjunto de datos ToothGrowth, que cuenta con 60 filas. Lo partiremos en dos, la primera con un 70% de las filas (42) y la segunda con un 30% (18 filas). Aunque en este ejemplo no es necesario, empleamos la función round, para que en el caso de que por ejemplo el número de filas sea 6,6 devuelva 7 filas en lugar de 6.

  • head y tal
  • head(ToothGrowth, round(nrow(ToothGrowth)*0.7))
    tail(ToothGrowth, round(nrow(ToothGrowth)*0.3))
    
  • Filtrando con índices
  • porcentaje = round(0.7*nrow(ToothGrowth))
    ToothGrowth[1:porcentaje,]
    ToothGrowth[-(1:porcentaje),]
    
  • Usando dplyr
  • porcentaje = round(0.7*nrow(ToothGrowth))
    library(dplyr)
    slice(ToothGrowth, 1:porcentaje)
    slice(ToothGrowth, -(1:porcentaje))

    Resultado

    Source: local data frame [42 x 3]
    
        len supp dose
    1   4.2   VC  0.5
    2  11.5   VC  0.5
    3   7.3   VC  0.5
    4   5.8   VC  0.5
    5   6.4   VC  0.5
    6  10.0   VC  0.5
    7  11.2   VC  0.5
    8  11.2   VC  0.5
    9   5.2   VC  0.5
    10  7.0   VC  0.5
    ..  ...  ...  ...
    
    Source: local data frame [18 x 3]
    
        len supp dose
    1  23.6   OJ    1
    2  26.4   OJ    1
    3  20.0   OJ    1
    4  25.2   OJ    1
    5  25.8   OJ    1
    6  21.2   OJ    1
    7  14.5   OJ    1
    8  27.3   OJ    1
    9  25.5   OJ    2
    10 26.4   OJ    2
    11 22.4   OJ    2
    12 24.5   OJ    2
    13 24.8   OJ    2
    14 30.9   OJ    2
    15 26.4   OJ    2
    16 27.3   OJ    2
    17 29.4   OJ    2
    18 23.0   OJ    2
    

    Entradas relacionadas

    Referencias

    Nube de datos