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

在R中识别连续5行Break=1并生成起止标记列的方法

在R中实现连续5行Break=1时标记Start/Stop的方法

首先构造你的示例数据:

df <- data.frame(
  Break = c(1,1,1,1,1,0,0,0,0),
  Start = c(1,0,0,0,0,0,0,0,0),
  Stop = c(0,0,0,0,1,0,0,0,0)
)

方法1:使用dplyr包(简洁易读)

先加载dplyr包(未安装的话先运行install.packages("dplyr")),通过分组标记连续的Break值,再筛选出长度为5的分组进行标记:

library(dplyr)

df_result <- df %>%
  # 生成连续相同Break值的分组ID
  mutate(grp = cumsum(Break != lag(Break, default = 0))) %>%
  # 按分组计算每组的行数
  group_by(grp) %>%
  mutate(grp_size = n()) %>%
  ungroup() %>%
  # 根据条件生成NewCol
  mutate(
    NewCol = case_when(
      grp_size == 5 & Start == 1 ~ "Start",
      grp_size == 5 & Stop == 1 ~ "Stop",
      TRUE ~ ""
    )
  ) %>%
  # 移除辅助列
  select(-grp, -grp_size)

print(df_result)

方法2:基础R实现(无需额外包)

如果不想加载第三方包,可以用基础R函数完成:

# 生成连续相同Break值的分组ID
df$grp <- cumsum(c(1, diff(df$Break) != 0))
# 计算每个分组的行数
grp_size <- tapply(df$Break, df$grp, length)
df$grp_size <- grp_size[as.character(df$grp)]

# 初始化NewCol并填充标记
df$NewCol <- ""
df$NewCol[df$grp_size == 5 & df$Start == 1] <- "Start"
df$NewCol[df$grp_size == 5 & df$Stop == 1] <- "Stop"

# 移除辅助列
df <- df[, !names(df) %in% c("grp", "grp_size")]

print(df)

两种方法最终都会得到目标结果:仅当存在连续5行Break=1时,在对应Start=1的行标记Start,Stop=1的行标记Stop,其余行留空。

内容的提问来源于stack exchange,提问作者P. Vauclin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 21:55:15