Cómo calcular la diferencia de tiempo con la fila anterior de un marco de datos por grupo en R

Un marco de datos puede consistir en diferentes valores pertenecientes a grupos. Las columnas pueden tener valores pertenecientes a diferentes tipos de datos o períodos de tiempo como objetos POSIXct. Estos objetos permiten la aplicación de operaciones matemáticas fácilmente, que se pueden realizar de las siguientes maneras: 

Método 1: Usar el paquete dplyr

El método group_by se usa para dividir y segregar la fecha en función de los grupos contenidos en las columnas específicas. La columna requerida para agrupar se especifica como un argumento de esta función. Puede contener varios nombres de columna.

Sintaxis:

grupo_por(col1, col2, …)

A esto le sigue la aplicación del método mutate() que se utiliza para cambiar orientaciones y realizar manipulaciones en los datos. El nuevo nombre de columna se puede especificar usando el nuevo nombre de columna. La diferencia con la fila anterior se puede calcular utilizando el método lag() de esta biblioteca. Este método encuentra los valores anteriores en un vector.

Sintaxis:

retraso (x, n = 1L, predeterminado = NA)

Parámetro:

  • x – Un vector de valores
  • n – Número de posiciones por retrasar
  • predeterminado (Predeterminado: NA): el valor utilizado para filas inexistentes.

Las primeras apariciones de cualquier grupo se reemplazan por valores NA. 

Ejemplo:

R

library(dplyr)
 
# creating a dataframe
data_frame <- data.frame(col1 = sample(6:9, 5 , replace = TRUE),
                         col3 =  c(as.POSIXct("2021-05-08 08:32:07"),
                                   as.POSIXct("2021-07-18 00:21:07"),
                                   as.POSIXct("2020-11-28 23:32:09"),
                                   as.POSIXct("2021-05-11 18:32:07"),
                                   as.POSIXct("2021-05-08 08:32:07"))
                         )
print ("Original DataFrame")
print (data_frame)
 
# computing difference of each group
data_frame %>%
  arrange(col1, col3) %>%
  group_by(col1) %>%
  mutate(diff = col3 - lag(col3))

Producción

[1] "Original DataFrame" 
   col1                col3
1    8 2021-05-08 08:32:07 
2    8 2021-07-18 00:21:07 
3    7 2020-11-28 23:32:09 
4    6 2021-05-11 18:32:07 
5    7 2021-05-08 08:32:07 
# A tibble: 5 x 3 
# Groups:   col1 [3]    
           col1 col3                diff            
         <int> <dttm>              <drtn>        
1     6 2021-05-11 18:32:07       NA secs 
2     7 2020-11-28 23:32:09       NA secs 
3     7 2021-05-08 08:32:07 13856398 secs 
4     8 2021-05-08 08:32:07       NA secs 
5     8 2021-07-18 00:21:07  6104940 secs

Método 2: Usar el método tapply

El método tapply() se usa para aplicar una función en la lista o el objeto de marco de datos. La función especificada, que puede ser definida por el usuario o predefinida, se aplica a cada celda del objeto del marco de datos.

Sintaxis: 

tapply(X, ÍNDICE, DIVERSIÓN)

Parámetro: 

  • X: un objeto R, un marco de datos. Por lo general, similar a un vector, lo que permite subconfigurar con [.
  • ÍNDICE: una lista de uno o más factores, cada uno de la misma longitud que X. Los elementos son forzados a factores por as.factor.
  • FUN – una función a aplicar

En este escenario, la función es calcular la diferencia en marcos de tiempo, con las unidades como segundos. Todas las primeras instancias de los valores encontrados en un grupo se reemplazan por cero. 

Ejemplo:

R

# creating a dataframe
data_frame <- data.frame(col1 = sample(6:9, 5 , replace = TRUE),
                         col3 =  c(as.POSIXct("2021-05-08 08:32:07"),
                                   as.POSIXct("2021-07-18 00:21:07"),
                                   as.POSIXct("2020-11-28 23:32:09"),
                                   as.POSIXct("2021-05-11 18:32:07"),
                                   as.POSIXct("2021-05-08 08:32:07"))
                         )
print ("Original DataFrame")
print (data_frame)
 
# computing difference of each group
data_frame$diff <- unlist(tapply(data_frame$col3, INDEX = data_frame$col1,
                          FUN = function(x) c(0, `units<-`(diff(x), "secs"))))
                                  
print ("Modified DataFrame")
print (data_frame)

 
Producción

[1] "Original DataFrame" 
col1                col3 
1    7 2021-05-08 08:32:07 
2    6 2021-07-18 00:21:07 
3    8 2020-11-28 23:32:09 
4    7 2021-05-11 18:32:07 
5    6 2021-05-08 08:32:07 
[1] "Modified DataFrame" 
col1                col3     diff 
1    7 2021-05-08 08:32:07        0 
2    6 2021-07-18 00:21:07 -6104940 
3    8 2020-11-28 23:32:09        0 
4    7 2021-05-11 18:32:07   295200 
5    6 2021-05-08 08:32:07        0

Método 3: Usando data.table

Se puede agregar una nueva columna para calcular la diferencia de tiempo entre las filas de la tabla de datos. El método difftime() se puede utilizar para calcular esta diferencia. Se utiliza para calcular los intervalos de tiempo o las diferencias. 

Sintaxis:

diferencia de tiempo (t1, t2, unidades)

Parámetro: 

  • t1, t2: objetos de fecha y hora o de fecha.
  • unidades: unidades en forma de string de caracteres para devolver el resultado

Para encontrar el siguiente valor de zona horaria, es decir, t2 que se aplicará en difftime(), se utiliza el método shift() para inducir el adelanto o el retraso en el vector o lista de entrada especificados. 

Sintaxis:

desplazamiento (x, relleno)

Parámetro: 

  • x: un vector, una lista, un marco de datos o una tabla de datos.
  • relleno – indicador del valor de relleno a introducir

El atributo by se agrega al grupo de datos por el nombre de columna especificado. 

Ejemplo:

R

library("data.table")
 
# creating a dataframe
dt <- data.table(col1 = sample(6:9, 5 , replace = TRUE),
                         col3 =  c(as.POSIXct("2021-05-08 08:32:07"),
                                   as.POSIXct("2021-07-18 00:21:07"),
                                   as.POSIXct("2020-11-28 23:32:09"),
                                   as.POSIXct("2021-05-11 18:32:07"),
                                   as.POSIXct("2021-05-08 08:32:07"))
                         )
print ("Original DataFrame")
print (dt)
 
# computing difference of each group
dt[, diff := difftime(col3, shift(col3, fill=col3[1L]),
                      units="secs"), by=col1]
 
print ("Modified DataFrame")
print (dt)

Producción

[1] "Original DataFrame" 
col1                col3 
1:    7 2021-05-08 08:32:07 
2:    7 2021-07-18 00:21:07 
3:    8 2020-11-28 23:32:09 
4:    8 2021-05-11 18:32:07 
5:    8 2021-05-08 08:32:07 
[1] "Modified DataFrame" 
col1                col3         diff 
1:    7 2021-05-08 08:32:07        0 secs 
2:    7 2021-07-18 00:21:07  6104940 secs 
3:    8 2020-11-28 23:32:09        0 secs 
4:    8 2021-05-11 18:32:07 14151598 secs 
5:    8 2021-05-08 08:32:07  -295200 secs

Publicación traducida automáticamente

Artículo escrito por yippeee25 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *