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

在R中生成Repeat变量:统计同一ID连续日期score>0的次数

生成Repeat变量的R实现方案

先还原示例数据:

iddatescoreRepeat(目标结果)
1199011
1199132
119921.53
11993-10
2198911
2199000
2199111
2199222
31993-30
31994-20
3199531
3199642

需求规则:按id分组,同一组内,若当前行score > 0,则Repeat为前一行Repeat值加1(组内第一行符合条件则为1);若score <= 0,则Repeat直接置为0。


方法一:使用dplyr(tidyverse生态)

向量化处理效率更高,适合大数据集:

library(dplyr)

# 假设数据框名为df,先确保按id和日期排序(关键前提)
df <- df %>%
  arrange(id, date) %>%
  group_by(id) %>%
  mutate(
    # 标记当前score是否为正
    is_positive = score > 0,
    # 生成连续分组ID:每次遇到非正score时分组ID递增,将连续正score的行归为一组
    run_group = cumsum(!is_positive),
    # 每组内生成递增序号,非正score的行置0
    Repeat = ifelse(is_positive, row_number(run_group), 0)
  ) %>%
  # 移除中间辅助变量
  select(-is_positive, -run_group) %>%
  ungroup()

方法二:Base R实现(无需第三方包)

适合不想加载额外包的场景:

# 先按id和date排序,保证顺序正确
df <- df[order(df$id, df$date), ]

# 初始化Repeat列
df$Repeat <- 0

# 遍历每个唯一id
for (current_id in unique(df$id)) {
  # 获取当前id对应的行索引
  id_rows <- which(df$id == current_id)
  current_count <- 0
  
  for (row_idx in id_rows) {
    if (df$score[row_idx] > 0) {
      current_count <- current_count + 1
      df$Repeat[row_idx] <- current_count
    } else {
      current_count <- 0
      df$Repeat[row_idx] <- 0
    }
  }
}

两种方法都能生成符合要求的Repeat列,验证后结果与示例表格一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 03:54:27