如何在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
相关产品推荐
相关产品推荐

