在R中实现带条件的累积求和:Signal3列编码难题
解决Signal3列的连续1统计问题
需求明确
当signal1 == 1时,开始统计signal2中连续出现的1的数量,直至signal2 == 0时停止,统计结果存入signal3列。
示例数据
先构造一个符合场景的示例数据集:
df <- data.frame( signal1 = c(0, 1, 0, 0, 0, 1, 0, 0, 0, 0), signal2 = c(1, 1, 1, 1, 0, 1, 1, 0, 1, 1), signal3 = rep(NA, 10) # 待填充的目标列 )
实现方案
方案1:使用tidyverse(dplyr)
适合习惯管道式编程的用户:
library(dplyr) df <- df %>% # 标记统计区间:signal1触发或signal2从0转1时开启新组 mutate(group = cumsum(signal1 == 1 | (lag(signal2, default = 0) == 0 & signal2 == 1))) %>% group_by(group) %>% mutate( # 仅在包含signal1触发的组内,对signal2的1进行累加计数 signal3 = ifelse(any(signal1 == 1), cumsum(signal2 == 1 & cumsum(signal1 == 1) > 0), NA), # 遇到signal2==0后,后续行重置为NA signal3 = ifelse(cumsum(signal2 == 0) > 0 & any(signal1 == 1), NA, signal3) ) %>% ungroup() %>% select(-group)
方案2:使用Base R
无需额外依赖包,适合轻量场景:
df$signal3 <- NA # 找到所有signal1触发的起始位置 start_positions <- which(df$signal1 == 1) for (start in start_positions) { # 找到当前起始点后第一个signal2为0的位置 first_zero <- which(df$signal2[start:nrow(df)] == 0)[1] end_position <- ifelse(is.na(first_zero), nrow(df), start + first_zero - 1) # 填充连续1的计数 if (start < end_position) { df$signal3[start:(end_position - 1)] <- 1:(end_position - start) } }
验证结果
运行代码后,输出df可以看到符合需求的结果:
print(df)
输出:
signal1 signal2 signal3 1 0 1 NA 2 1 1 1 3 0 1 2 4 0 1 3 5 0 0 NA 6 1 1 1 7 0 1 2 8 0 0 NA 9 0 1 NA 10 0 1 NA
内容的提问来源于stack exchange,提问作者Franky
相关产品推荐
相关产品推荐

