如何在R中按条件提取同组同类的最小start与最大end值
R语言合并分组下重叠区间的实现方法
你需要的是经典的分组重叠区间合并功能,由于你的数据已经提前按group、class、start排序,实现起来非常简单,这里给你常用的dplyr实现方案:
前置处理
首先需要将字符类型的start和end列转为数值型,避免字符比较出现逻辑错误:
df$start <- as.numeric(df$start) df$end <- as.numeric(df$end)
核心实现代码
library(dplyr) result <- df %>% # 按group和class分组,不同分组的区间互不干扰 group_by(group, class) %>% # 生成段标识:当前start大于之前所有行的最大end时,判定为新的段 mutate(segment = cumsum(start > lag(cummax(end), default = 0))) %>% # 按group、class、段标识二次分组 group_by(group, class, segment) %>% # 汇总每个段的最小start和最大end summarise( start = min(start), end = max(end), .groups = "drop" ) %>% # 移除不需要的段标识列 select(-segment)
输出结果验证
打印result即可得到你需要的输出:
# A tibble: 4 × 4 group class start end <chr> <chr> <dbl> <dbl> 1 1 2 23477018 47909872 2 1 2 48339885 53818713 3 1 3 87274 5329014 4 1 3 6733569 13934484
该方案处理数千行数据性能足够,逻辑完全匹配你描述的规则。
内容的提问来源于stack exchange,提问作者L R
相关产品推荐
相关产品推荐

