2015-11-14

Contar el número de ocurrencias basado en dos columnas en R

Title

Problema

Deseamos añadir un contador con el número de ocurrencias basado en las columnas timey site. Con la particularidad de que la agrupación de time sea por día, si no, cada fila sería una ocurrencia distinta. Es decir, cada vez que la combinación de día y site diferente, reiniciará el contador.

                  time site val
1  2014-09-01 00:00:00 2001   1
2  2014-09-01 00:15:00 2001   0
3  2014-09-01 00:30:00 2001   2
4  2014-09-01 00:45:00 2001   0
5  2014-09-01 00:00:00 2002   1
6  2014-09-01 00:15:00 2002   0
7  2014-09-01 00:30:00 2002   2
8  2014-09-02 00:45:00 2001   0
9  2014-09-02 00:00:00 2001   1
10 2014-09-02 00:15:00 2001   0
11 2014-09-02 00:30:00 2001   2
12 2014-09-02 00:45:00 2001   0
13 2014-09-02 00:00:00 2002   1
14 2014-09-02 00:15:00 2002   0
15 2014-09-02 00:30:00 2002   2
16 2014-09-02 00:45:00 2001   0
df <- structure(list(time = structure(c(1409522400, 1409523300, 1409524200, 1409525100, 1409522400, 1409523300, 1409524200, 1409611500, 1409608800, 1409609700, 1409610600, 1409611500, 1409608800, 1409609700, 1409610600, 1409611500), class = c("POSIXct", "POSIXt"), tzone = ""), site = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L), .Label = c("2001", "2002"), class = "factor"), val = c(1L, 0L, 2L, 0L, 1L, 0L, 2L, 0L, 1L, 0L, 2L, 0L, 1L, 0L, 2L, 0L)), .Names = c("time", "site", "val"), row.names = c(NA, -16L), class = "data.frame")

Solución

Utilizamos dplyr. Primero creamos una columna id, extrayendo el día de la fecha (columna time). Después agrupamos por site e id, y añadimos una nueva variable countercon el número de ocurrencias para esos dos grupos.

library(dplyr)
df$id <- as.factor(format(df$time,'%d'))
library(dplyr)
df %>% group_by(site, id) %>% mutate(counter = row_number()) 
Ahora tenemos un contador que empieza desde 1 cada vez que el día y el site cambian. Si se vuelven a repetir, como en la última fila, continua con la numeración.

Source: local data frame [16 x 5]
Groups: site, id

                  time site val id counter
1  2014-09-01 00:00:00 2001   1 01       1
2  2014-09-01 00:15:00 2001   0 01       2
3  2014-09-01 00:30:00 2001   2 01       3
4  2014-09-01 00:45:00 2001   0 01       4
5  2014-09-01 00:00:00 2002   1 01       1
6  2014-09-01 00:15:00 2002   0 01       2
7  2014-09-01 00:30:00 2002   2 01       3
8  2014-09-02 00:45:00 2001   0 02       1
9  2014-09-02 00:00:00 2001   1 02       2
10 2014-09-02 00:15:00 2001   0 02       3
11 2014-09-02 00:30:00 2001   2 02       4
12 2014-09-02 00:45:00 2001   0 02       5
13 2014-09-02 00:00:00 2002   1 02       1
14 2014-09-02 00:15:00 2002   0 02       2
15 2014-09-02 00:30:00 2002   2 02       3
16 2014-09-02 00:45:00 2001   0 02       6

Referencias

No hay comentarios:

Publicar un comentario

Nube de datos