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

基于日期与非零值生成每日重置的Unique ID(R语言)

解决方案

要实现按日期重置、为连续非零值事件生成唯一ID的需求,核心是要在每个Date分组内独立计算事件ID,而非全局计算。原代码未利用dplyr的分组上下文,导致group_by(Date)未生效,以下是修正方案:

实现代码

library(dplyr)

# 处理数据集,生成每日重置的事件ID
data_processed <- data %>%
  group_by(Date) %>%
  mutate(
    # 标记非零行
    is_nonzero = Value != 0,
    # 标记每个非零事件的起始行:当前非零且前一行是零(或组首非零行)
    event_start = is_nonzero & lag(is_nonzero, default = FALSE) == FALSE
  ) %>%
  # 对起始行累积求和得到事件ID,零值设为NA
  mutate(cycleID = ifelse(is_nonzero, cumsum(event_start), NA_integer_)) %>%
  # 移除中间辅助列(可选)
  select(-is_nonzero, -event_start)

代码说明

  1. 分组计算:通过group_by(Date)确保每个日期内的ID独立计算,每日自动重置计数
  2. 事件标记:
    • is_nonzero:标记哪些行是有效非零值
    • event_start:识别每个连续非零事件的起始点(当前行非零,且前一行是零/组首行)
  3. 生成ID:cumsum(event_start)对起始点累加,同一连续非零块会得到相同ID,零值行设为NA

原代码问题解析

原代码直接使用data$value全局访问数据列,未在dplyr的分组环境中执行计算,因此group_by(Date)并未生效,导致ID跨日期连续。必须通过mutate等dplyr函数在分组上下文内操作,才能实现按日期重置的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:22:39