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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:45:33