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

R语言如何在变量A分组内新序列起始时生成sub_id

R 分组内生成序列标识sub_id的解决方案

问题说明

现有如下tibble结构数据:

tibble(
    A = c(1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5),
    B = c(1, 1, 2, 1, 2, 3, 1, 2, 1, 1, 1, 2, 3, 4, 1, 1),
)

数据预览:

# A tibble: 16 x 2
       A     B
   <dbl> <dbl>
 1     1     1
 2     2     1
 3     2     2
 4     2     1
 5     2     2
 6     2     3
 7     3     1
 8     3     2
 9     3     1
10     3     1
11     4     1
12     4     2
13     4     3
14     4     4
15     4     1
16     5     1

需要实现的效果:以字段A作为分组依据,每当组内出现B=1时作为新序列的起始,生成对应的sub_id字段,期望输出如下:

tibble(
    A = c(1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5),
    B = c(1, 1, 2, 1, 2, 3, 1, 2, 1, 1, 1, 2, 3, 4, 1, 1),
    sub_id = c(1, 1, 1, 2, 2, 2, 1, 1, 2, 3, 1, 1, 1, 1, 2, 1)
)

输出预览:

# A tibble: 16 x 3
       A     B sub_id
   <dbl> <dbl>  <dbl>
 1     1     1      1
 2     2     1      1
 3     2     2      1
 4     2     1      2
 5     2     2      2
 6     2     3      2
 7     3     1      1
 8     3     2      1
 9     3     1      2
10     3     1      3
11     4     1      1
12     4     2      1
13     4     3      1
14     4     4      1
15     4     1      2
16     5     1      1

实现方法

使用tidyverse套件的dplyr库即可实现该逻辑,核心是在A的分组内,对B==1的判断结果做累加求和:

library(tidyverse)

# 构造原始数据
df <- tibble(
    A = c(1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5),
    B = c(1, 1, 2, 1, 2, 3, 1, 2, 1, 1, 1, 2, 3, 4, 1, 1),
)

# 生成sub_id
df_result <- df %>%
  group_by(A) %>%
  mutate(sub_id = cumsum(B == 1)) %>%
  ungroup()

逻辑说明

在每个A的分组内:

  • 当B等于1时,B==1返回逻辑值TRUE,对应数值为1;否则返回FALSE,对应数值为0
  • 对上述逻辑值序列做累加求和cumsum(),每次遇到B=1时累加值加1,刚好对应新序列的起始标识

内容的提问来源于stack exchange,提问作者James Bejon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 10:06:00