Crear variable retrasada por grupo en R DataFrame

La variable rezagada es el tipo de variable que contiene el valor anterior de la variable para la que queremos crear la variable rezagada y se desprecia el primer valor. Los datos se pueden segregar en función de diferentes grupos en el lenguaje de programación R y luego estas categorías se pueden procesar de manera diferente. 

Método 1: Usar el paquete dplyr

El paquete «dplyr» en lenguaje R se utiliza para realizar mejoras y manipulaciones de datos y se puede cargar en el espacio de trabajo.

El método group_by() en R se puede usar para categorizar datos en grupos según una sola columna o un grupo de varias columnas. Todas las combinaciones únicas plausibles de las columnas de entrada se apilan juntas como un solo grupo.

Sintaxis:

group_by(argumentos .. ),

donde los argumentos contienen una secuencia de columnas para agrupar datos sobre

A esto le sigue la aplicación del método mutate() sobre el marco de datos que se utiliza para simular la creación, eliminación y modificación de las columnas del marco de datos. El método mutate() agrega nuevas variables y conserva las existentes. El método mutate toma como argumento el método lag() para realizar transmutaciones en los datos. El método lag() se usa para inducir valores retrasados ​​para la variable especificada.

Sintaxis:

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

Parámetros:

  • col: la columna del marco de datos para introducir valores retrasados. 
  • n – (Predeterminado: 1) El número de posiciones para liderar o retrasar por
  • predeterminado – (Predeterminado: NA) Valor utilizado para filas inexistentes. 

La primera aparición de la variable en el atributo de la columna de entrada lag() se reemplaza por NA. Todas las instancias sucesivas reemplazadas por el valor anterior que se asignó al mismo grupo. 

El resultado de estos métodos tiene la forma de un tibble que es una estructura similar a una tabla y se devuelve la información adecuada sobre el número de grupos y la clase de columna. 

Ejemplo 1:

R

library("dplyr")
  
# creating a data frame
data_frame <- data.frame(col1 = rep(c(1:3), each = 3),
                         col2 = letters[1:3]
                         )
  
print ("Original DataFrame")
print (data_frame)
  
data_mod <- data_frame %>%                            
  group_by(col1) %>%
  dplyr::mutate(laggedval = lag(col2, n = 1, default = NA)) 
  
print ("Modified Data")
print (data_mod)

Producción

[1] "Original DataFrame" 
col1 col2 
1    1    a 
2    1    b
3    1    c 
4    2    a 
5    2    b 
6    2    c 
7    3    a 
8    3    b 
9    3    c 
[1] "Modified Data" 
# A tibble: 9 x 3 
# Groups:   col1 [3]    
col1 col2  laggedval   
<int> <fct> <fct>     
1     1 a     NA        
2     1 b     a         
3     1 c     b         
4     2 a     NA        
5     2 b     a         
6     2 c     b         
7     3 a     NA        
8     3 b     a         
9     3 c     b   

La agrupación se puede realizar en función de varias columnas, donde los grupos creados dependen de los diferentes conjuntos únicos posibles que se pueden crear a partir de todas las combinaciones de las columnas involucradas. 

Ejemplo 2:

R

library("tidyverse")
  
# creating a data frame
data_frame <- data.frame(col1 = rep(c(1:3), each = 3),
                         col2 = letters[1:3],
                         col3 = c(1,4,1,2,2,2,1,2,2))
  
print ("Original DataFrame")
print (data_frame)
  
print ("Modified DataFrame")
data_mod <- data_frame %>%                            
  group_by(col1,col3) %>%
  dplyr::mutate(laggedval = lag(col2, n = 1, default = NA)) 
  
print ("Modified Data")
print (data_mod) 

Producción

[1] "Original DataFrame" 
   col1 col2 col3 
1    1    a    1 
2    1    b    4 
3    1    c    1 
4    2    a    2 
5    2    b    2 
6    2    c    2 
7    3    a    1 
8    3    b    2 
9    3    c    2 
[1] "Modified DataFrame" 
[1] "Modified Data" 
# A tibble: 9 x 4 
# Groups:   col1, col3 [5]    
col1 col2   col3 laggedval   
  <int> <fct> <dbl> <fct>     
1     1 a         1 NA        
2     1 b         4 NA        
3     1 c         1 a         
4     2 a         2 NA        
5     2 b         2 a         
6     2 c         2 b         
7     3 a         1 NA        
8     3 b         2 NA        
9     3 c         2 b  

Método 2: Usar duplicado()

Inicialmente, el número de filas del marco de datos se obtiene mediante el método nrow() en lenguaje R. A esto le sigue la extracción de valores de la columna para introducir valores retrasados ​​al excluir el valor de la última fila. Esto devolverá un vector de un valor faltante (inducido para la última fila) seguido de los valores de fila en el orden de la columna deseada. 

La primera instancia de cada ocurrencia de grupo es luego identificada por el método duplicado() y reemplazada por NA usando el método which(). La modificación de estos valores se almacena en el nuevo nombre de columna asignado al marco de datos. 

Ejemplo:

R

# creating a data frame
data_frame <- data.frame(col1 = rep(c(1:3), each = 3),
                         col2 = letters[1:3]
                         )
  
print ("Original DataFrame")
print (data_frame)
  
# getting the last row col index
last_row <- -nrow(data_frame)
excl_last_row <- as.character(data_frame$col2[last_row])
  
# create a vector of values of NA and col2  
data_frame$lag_value <- c( NA, excl_last_row)
  
# replace first occurence by NA
data_frame$lag_value[which(!duplicated(data_frame$col1))] <- NA
print ("Modified Data")
print (data_frame)   

Producción

[1] "Original DataFrame" 
   col1 col2 
1    1    a 
2    1    b 
3    1    c 
4    2    a 
5    2    b 
6    2    c 
7    3    a 
8    3    b 
9    3    c 
[1] "Modified Data" 
  col1 col2 lag_value 
1    1    a      <NA> 
2    1    b         a 
3    1    c         b 
4    2    a      <NA> 
5    2    b         a 
6    2    c         b 
7    3    a      <NA> 
8    3    b         a 
9    3    c         b

Publicación traducida automáticamente

Artículo escrito por mallikagupta90 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 *