You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 01:16:05