在R语言中将连续TRUE值的行合并为单行的实现方法
R语言实现连续TRUE值合并分组
原始数据
首先定义初始数据框:
df <- data.frame(ID = c(1, 2, 3, 4, 5, 6, 7), Value = c(FALSE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE))
第一步:生成连续值分组
给连续的TRUE段分配唯一分组号,FALSE统一归为0组,得到你需要的中间结果:
library(dplyr) df_with_group <- df %>% mutate( # 标记每个连续TRUE段的起始行 is_start = Value & (lag(Value, default = FALSE) == FALSE), # 为TRUE段分配递增分组号,FALSE设为0 Group = ifelse(Value, cumsum(is_start), 0) )
运行后得到的中间数据框:
| ID | Value | Group |
|---|---|---|
| 1 | FALSE | 0 |
| 2 | TRUE | 1 |
| 3 | TRUE | 1 |
| 4 | FALSE | 0 |
| 5 | TRUE | 2 |
| 6 | TRUE | 2 |
| 7 | TRUE | 2 |
第二步:聚合得到目标数据框
基于分组结果,将连续TRUE的ID合并为区间字符串,FALSE保留单个ID:
df_result <- df_with_group %>% group_by(Group, Value) %>% summarize( ID = ifelse(Value, paste0("(", min(ID), ", ", max(ID), ")"), as.character(min(ID))), # 用每组最小ID作为排序依据,保证结果顺序和原始数据一致 sort_key = min(ID), .groups = "drop" ) %>% arrange(sort_key) %>% select(-sort_key) # 删除辅助排序列
最终结果
运行后得到的目标数据框:
| ID | Value |
|---|---|
| 1 | FALSE |
| (2, 3) | TRUE |
| 4 | FALSE |
| (5, 7) | TRUE |
内容的提问来源于stack exchange,提问作者lafinur
相关产品推荐
相关产品推荐

