在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
相关产品推荐
相关产品推荐

