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

如何用R语言识别连续n个TRUE的模式并添加pattern列?

识别连续n个TRUE并标记对应行

问题分析

你需要识别数据中连续出现至少n个TRUE的片段,并将这些片段内的所有行标记为TRUE(存入pattern列),其余行标记为FALSE。注意原数据中outcome为字符型,需先转换为逻辑型方便后续判断。

解决方案(依赖dplyr和data.table)

使用data.table的rleid()函数快速对连续相同的outcome值分组,再结合dplyr判断每组是否符合条件:

library(dplyr)
library(data.table)

# 原数据
id <- c("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec")
outcome <- c("FALSE","TRUE","FALSE","TRUE","FALSE","FALSE","TRUE","TRUE","TRUE","FALSE","TRUE","TRUE")
df_example <- data.frame(id = id, outcome= outcome)

# 设置连续TRUE的阈值(示例中为3)
n <- 3

# 生成结果
df_result <- df_example %>%
  # 将字符型的outcome转为逻辑型
  mutate(outcome = as.logical(outcome)) %>%
  # 为连续相同的outcome值分配分组ID
  mutate(group_id = rleid(outcome)) %>%
  # 按分组ID聚合,判断每组是否全为TRUE、组内行数是否达标
  group_by(group_id) %>%
  mutate(
    is_all_true = all(outcome),
    group_size = n()
  ) %>%
  # 标记pattern列:满足条件则为TRUE,否则FALSE,转回字符型匹配示例格式
  mutate(pattern = as.character(is_all_true & group_size >= n)) %>%
  ungroup() %>%
  # 保留需要的列
  select(id, outcome, pattern)

# 输出结果
print(df_result)

纯dplyr实现(不依赖data.table)

如果不想引入data.table,可以用cumsum()和lag()手动生成连续分组ID:

library(dplyr)

df_result <- df_example %>%
  mutate(outcome = as.logical(outcome)) %>%
  # 手动生成连续相同值的分组ID
  mutate(
    group_id = cumsum(outcome != lag(outcome, default = first(outcome)))
  ) %>%
  group_by(group_id) %>%
  mutate(
    is_all_true = all(outcome),
    group_size = n()
  ) %>%
  mutate(pattern = as.character(is_all_true & group_size >= n)) %>%
  ungroup() %>%
  select(id, outcome, pattern)

为什么之前的group_by()+fill()无效?

group_by()通常用于按离散分类变量分组,无法直接识别连续的相同值片段;fill()仅用于填充缺失值,两者组合无法完成“连续值块识别+条件判断”的需求,必须先对连续相同值进行分组,再判断每组是否符合阈值要求。

内容的提问来源于stack exchange,提问作者andrew_kent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:45:34