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