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

如何在R中根据Events列中Accident首次出现分配连续组值?

嘿,这个分组需求挺明确的,我给你准备了两种R语言的实现方式,一种用tidyverse里的dplyr(适合习惯管道风格的朋友),另一种用基础R(不用额外装包),你可以根据自己的习惯选~

方法1:用dplyr实现(tidyverse生态)

首先假设你的数据框名为df,其中包含需要判断的Events列。核心思路是先标记出所有"Accident"的行,再通过滞后累计计数来生成符合要求的组号:

library(dplyr)

# 生成组号
df <- df %>%
  mutate(
    # 标记每行是否为Accident
    is_accident = Events == "Accident",
    # 生成组号:滞后标记后累计求和,再加1确保组号从1开始
    group = cumsum(lag(is_accident, default = 0)) + 1
  )

举个测试例子

我们创建一份模拟数据来验证效果:

# 测试数据框
test_df <- tibble(
  Events = c("Normal", "Normal", "Accident", "Normal", "Accident", "Normal", "Normal", "Accident")
)

# 应用分组逻辑
test_df <- test_df %>%
  mutate(
    is_accident = Events == "Accident",
    group = cumsum(lag(is_accident, default = 0)) + 1
  )

# 查看结果
print(test_df)

输出结果完全符合需求:

# A tibble: 8 × 3
  Events   is_accident group
  <chr>    <lgl>       <dbl>
1 Normal   FALSE           1
2 Normal   FALSE           1
3 Accident TRUE            1
4 Normal   FALSE           2
5 Accident TRUE            2
6 Normal   FALSE           3
7 Normal   FALSE           3
8 Accident TRUE            3

方法2:基础R实现(无需额外安装包)

如果你不想依赖tidyverse包,可以用基础R的方式实现,逻辑和上面完全一致:

# 假设数据框是df
# 第一步:标记Accident行
df$is_accident <- df$Events == "Accident"

# 第二步:生成滞后的标记(模拟dplyr的lag函数)
lag_accident <- c(0, df$is_accident[-nrow(df)])

# 第三步:累计求和生成组号
df$group <- cumsum(lag_accident) + 1

补充说明

如果你的数据最后一行不是"Accident",最后一个组会自动包含从最后一次Accident之后到数据末尾的所有行,这也符合分组的逻辑哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:53:07