📜  在 R DataFrame 中按组创建滞后变量

📅  最后修改于: 2022-05-13 01:54:30.151000             🧑  作者: Mango

在 R DataFrame 中按组创建滞后变量

滞后变量是包含我们要为其创建滞后变量的变量的先前值且忽略第一个值的变量类型。在 R 编程语言中可以根据不同的组对数据进行隔离,然后可以对这些类别进行不同的处理。

方法一:使用 dplyr 包

R 语言中的“dplyr”包用于执行数据增强和操作,可以加载到工作空间中。

R 中的 group_by() 方法可用于基于单列或一组多列将数据分类到组中。输入列的所有可能的独特组合都堆叠在一起作为一个组。

句法:

接下来是对数据框应用 mutate() 方法,该方法用于模拟数据框列的创建、删除和修改。 mutate() 方法添加新变量并保留现有变量。 mutate 方法将 lag() 方法作为参数对数据执行转换。 lag() 方法用于为指定变量引入滞后值。

变量在 lag() 输入列的属性中出现的第一个实例被 NA 替换。所有连续实例都被分配给同一组的先前值替换。

这些方法的结果是 tibble 的形式,它是一个类似表格的结构,并返回有关组数和列类的正确信息。

示例 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)


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)


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)


输出

[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   
       
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   

可以基于多个列进行分组,其中创建的组取决于可以从相关列的所有组合中创建的不同可能的唯一集。

示例 2:

电阻

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) 

输出

[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   
          
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  

方法二:使用duplicated()

最初,使用 R 语言中的 nrow() 方法获取数据帧的行数。然后从列中提取值以引入滞后值,排除最后一行值。这将返回一个包含一个缺失值(为最后一行引入)的向量,后跟按所需列的顺序排列的行值。

然后,每个组出现的第一个实例由duplicated() 方法标识,并使用which() 方法由NA 替换。这些值的修改存储在分配给数据框的新列名中。

例子:

电阻

# 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)   

输出

[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       
2    1    b         a 
3    1    c         b 
4    2    a       
5    2    b         a 
6    2    c         b 
7    3    a       
8    3    b         a 
9    3    c         b