如何用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
相关产品推荐
相关产品推荐

