在R的dplyr中根据change变量与前一行差异生成分组列
生成连续段分组变量的R实现
问题描述
我有一个数据框df,其中x是分组内的行号,value为数值变量,change是当前行与前一行的差值。需要创建一个group变量:
- 若当前行的
change值与前一行不同,则将group设为当前行的x值; - 若
change值与前一行相同,则将group设为该相同change值本次连续段首次出现时的x值。
原始数据
生成代码
df <- data.frame(x = c(1:11), value = c(0, 3, 1, 1, 3, 1, 2, 0, 0, 0, 0), change = c(0, -3, 2, 2, -3, 2, -1, 0, 0, 0, 0))
数据输出
x value change 1 1 0 0 2 2 3 -3 3 3 1 2 4 4 1 2 5 5 3 -3 6 6 1 2 7 7 2 -1 8 8 0 0 9 9 0 0 10 10 0 0 11 11 0 0
期望结果
结果代码
df <- data.frame(x = c(1:11), value = c(0, 3, 1, 1, 3, 1, 2, 0, 0, 0, 0), change = c(0, -3, 2, 2, -3, 2, -1, 0, 0, 0, 0), group = c(1, 2, 3, 3, 5, 6, 7, 8, 8, 8, 8))
结果输出
x value change group 1 1 0 0 1 2 2 3 -3 2 3 3 1 2 3 4 4 1 2 3 5 5 3 -3 5 6 6 1 2 6 7 7 2 -1 7 8 8 0 0 8 9 9 0 0 8 10 10 0 0 8 11 11 0 0 8
解决方案
核心是识别change的连续相同段,为每个段分配该段首行的x值作为group,以下是两种实现方式:
方法1:使用dplyr包
library(dplyr) df <- df %>% # 标记连续相同change的分段 mutate(segment = cumsum(change != lag(change, default = change[1]))) %>% # 按分段分组,取每组第一个x作为group group_by(segment) %>% mutate(group = first(x)) %>% ungroup() %>% # 移除中间变量 select(-segment)
方法2:基础R实现
# 生成连续段的标识 segment <- c(1, cumsum(df$change[-1] != df$change[-nrow(df)])) # 按段提取每组首行的x值 df$group <- ave(df$x, segment, FUN = function(x) x[1])
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

