R语言如何为数据框创建滞后一个整组的lag变量
R语言实现数据框按整组偏移的滞后值计算
需求为对data.frame实现按完整分组偏移的lag计算:滞后一个完整分组取值,即前一个分组的固定Value值作为后一个分组所有行的Lag列取值,首个分组Lag值为NA。已知前提为同一分组内的所有Value取值完全相同。
示例数据
原始测试数据构造
Letter = c('A', 'A', 'A', 'B', 'C', 'C', 'D') Value = c(11, 11, 11, 4, 8, 8, 10) df <- data.frame(Letter, Value) df
原始数据输出:
Letter Value 1 A 11 2 A 11 3 A 11 4 B 4 5 C 8 6 C 8 7 D 10
期望输出结果
添加Lag列后需要得到的结果如下:
Letter Value Lag 1 A 11 NA 2 A 11 NA 3 A 11 NA 4 B 4 11 5 C 8 4 6 C 8 4 7 D 10 8
实现方案
提供两种常用实现方式,可根据自己的使用习惯选择:
- base R原生方案:无需安装加载第三方包,逻辑直白
- dplyr方案:适配tidyverse数据处理流程,可读性强
base R实现代码
# 按分组出现顺序提取每个分组的唯一标识和对应Value group_map <- unique(df[, c("Letter", "Value")]) # 对分组Value做1位滞后 group_map$Lag <- c(NA, head(group_map$Value, -1)) # 将滞后值匹配回原数据框 df <- merge(df, group_map[, c("Letter", "Lag")], by = "Letter", sort = FALSE)
dplyr实现代码
library(dplyr) df <- df %>% group_by(Letter) %>% # 同组Value完全一致,取组内第一个值作为分组代表值即可 mutate(group_rep = first(Value)) %>% ungroup() %>% # 按分组出现顺序取前一个分组的代表值作为当前组Lag mutate(Lag = group_rep[match(Letter, unique(Letter)) - 1]) %>% select(-group_rep)
提示:如果实际数据中同一分组存在多个不同Value值,需要先明确分组的代表取值规则,再套用上述逻辑。
内容的提问来源于stack exchange,提问作者j181837
相关产品推荐
相关产品推荐

