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

在R语言中如何按分组标记列中首次连续重复的目标值实例?

按组标记首次连续出现的"High"序列

示例数据

首先生成示例数据框:

Group <- c("AGroup", "AGroup", "AGroup", "AGroup", "BGroup", "BGroup", "BGroup", "BGroup", "CGroup", "CGroup", "CGroup", "CGroup")
Status <- c("Low", "Low", "High", "High", "High", "Low", "High", "Low", "Low", "Low", "High", "High")

df <- data.frame(Group, Status)

期望生成的FirstHighRun列如下(标记首次连续"High"及其后续连续项为1,其余为0):

Group   Status  FirstHighRun
AGroup  Low     0 
AGroup  Low     0
AGroup  High    1
AGroup  High    1
BGroup  High    1
BGroup  Low     0
BGroup  High    0
BGroup  Low     0
CGroup  Low     0
CGroup  Low     0
CGroup  High    1
CGroup  High    1

需求说明

按Group分组,将Status列中首次出现的连续"High"值及其后续连续重复的实例标记为1,其余情况标记为0。例如BGroup中第二次出现的"High"因未连续跟随首次出现的"High",故标记为0。

解决方案

使用dplyr结合data.table的rleid函数可以高效实现需求,代码如下:

# 加载必要的包
library(dplyr)
library(data.table)

# 处理数据生成目标列
result_df <- df %>%
  group_by(Group) %>%
  # 为连续相同的Status分配唯一分组ID
  mutate(rleid = rleid(Status)) %>%
  # 找到每组中第一个出现"High"的连续组ID
  mutate(first_high_rleid = min(rleid[Status == "High"], na.rm = TRUE)) %>%
  # 判断当前行是否属于首次连续High组,且Status为High
  mutate(FirstHighRun = ifelse(rleid == first_high_rleid & Status == "High", 1, 0)) %>%
  # 移除中间辅助列
  select(-rleid, -first_high_rleid) %>%
  ungroup()

# 查看结果
print(result_df)

逻辑解释

  1. rleid(Status):给连续相同的Status值分配同一个ID,比如AGroup中前两个Low为ID 1,后两个High为ID 2;BGroup中第一个High为ID 1,后续Low为ID 2,第二个High为ID 3。
  2. min(rleid[Status == "High"], na.rm = TRUE):提取每组中第一个出现"High"的连续组ID,比如BGroup中首次High的组ID是1,第二次High的组ID是3,因此取1。
  3. 最后通过ifelse判断:如果当前行的组ID等于首次High的组ID,且Status为High,则标记为1,否则为0,完全匹配需求。

纯dplyr实现方案(无需data.table)

如果不想依赖data.table,可以用纯dplyr代码实现:

library(dplyr)

result_df <- df %>%
  group_by(Group) %>%
  # 标记是否为High,以及是否与前一行Status相同
  mutate(is_high = Status == "High",
         same_as_prev = Status == lag(Status, default = "")) %>%
  # 生成连续组ID:每次Status变化时组ID+1
  mutate(rleid = cumsum(!same_as_prev)) %>%
  # 找到首次High的组ID
  mutate(first_high_rleid = min(rleid[is_high], na.rm = TRUE)) %>%
  # 生成目标列
  mutate(FirstHighRun = ifelse(rleid == first_high_rleid & is_high, 1, 0)) %>%
  # 清理辅助列
  select(-is_high, -same_as_prev, -rleid, -first_high_rleid) %>%
  ungroup()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:25:18