R语言 在数据框架中按组创建滞后变量
滞后变量是一种变量类型,它包含了我们想要创建滞后变量的变量的前一个值,第一个值被忽略了。在R编程语言中,数据可以根据不同的组进行分离,然后对这些类别进行不同的处理。
方法1:使用dplyr包
R语言中的 “dplyr “包用于执行数据增强和操作,并可以加载到工作空间。
R语言中的group_by()方法可用于根据单列或多列组将数据归类为组。所有输入列的合理的唯一组合被堆叠在一起作为一个单一的组。
语法
group_by(args …)。
其中,args包含一串要分组数据的列。
接下来是在数据框上应用mutate()方法,用来模拟数据框列的创建、删除和修改。mutate()方法添加新的变量,同时也保留现有的变量。mutate方法以lag()方法为参数,对数据进行转换。lag()方法用于诱导指定变量的滞后值。
语法:
lag(col, n = 1L, default = NA)
参数:
- col – 数据框架中要引入滞后值的列。
- n – (默认:1) 引导或滞后的位置数
- default – (默认值:NA)用于不存在的行的值。
在lag()输入列的属性中,变量出现的第一个实例被替换为NA。所有连续出现的实例由之前分配给同一组的值替换。
这些方法的结果是以tibble的形式出现的,它是一个类似于表格的结构,并且会返回关于组数和列类的适当信息。
例1 :
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)
输出
[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
分组可以基于多个列进行,其中创建的组取决于所有相关列的组合中可能创建的不同的唯一集。
例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
<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
方法2:使用diplicated()
最初,使用R语言中的nrow()方法获取数据框的行数。随后,从列中提取数值,在排除最后一行的数值时引入滞后值。这将返回一个缺失值的向量(最后一行的诱导值),然后是按所需列顺序排列的行值。
然后,每个组出现的第一个实例被重复()方法识别,并使用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_framecol2[last_row])
# create a vector of values of NA and col2
data_framelag_value <- c( NA, excl_last_row)
# replace first occurrence by NA
data_framelag_value[which(!duplicated(data_framecol1))] <- 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 <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