在R中生成Repeat变量:统计同一ID连续日期score>0的次数
生成Repeat变量的R实现方案
先还原示例数据:
| id | date | score | Repeat(目标结果) |
|---|---|---|---|
| 1 | 1990 | 1 | 1 |
| 1 | 1991 | 3 | 2 |
| 1 | 1992 | 1.5 | 3 |
| 1 | 1993 | -1 | 0 |
| 2 | 1989 | 1 | 1 |
| 2 | 1990 | 0 | 0 |
| 2 | 1991 | 1 | 1 |
| 2 | 1992 | 2 | 2 |
| 3 | 1993 | -3 | 0 |
| 3 | 1994 | -2 | 0 |
| 3 | 1995 | 3 | 1 |
| 3 | 1996 | 4 | 2 |
需求规则:按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
相关产品推荐
相关产品推荐

