如何基于重叠关系对区间进行分组标记?(R语言场景)
R语言用ivs包实现区间重叠分组字母标记
1. 安装加载ivs包
ivs是R中专门处理区间数据的高效工具包,先安装并加载:
install.packages("ivs") library(ivs)
2. 导入并预处理数据
把你提供的数据集转换成ivs要求的区间格式:
# 加载你的区间数据 df <- structure(list(Interval = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), Start = c(5.3, 6.5, 7.6, 7.8, 8, 8.3, 8.5, 8.7, 8.8, 9.9), End = c(7.5, 8.7, 9.8, 10, 10.2, 10.5, 10.7, 10.9, 11, 12.1)), row.names = c(NA, -10L), spec = structure(list(cols = list(Interval = structure(list(), class = c("collector_double", "collector")), Start = structure(list(), class = c("collector_double", "collector")), End = structure(list(), class = c("collector_double", "collector"))), default = structure(list(), class = c("collector_guess", "collector")), delim = "\t"), class = "col_spec"), class = c("spec_tbl_df","tbl_df", "tbl", "data.frame")) # 创建iv类型的区间列 df$interval <- iv(df$Start, df$End)
3. 实现分组标记
根据你的规则,我们需要:
- 对相互重叠(含间接重叠)的区间分配同一基础分组
- 对同时与多组重叠的区间,合并相关分组的字母
# 第一步:用iv_group_overlaps获取连通分组(间接重叠的区间归为同一组) df$group_id <- iv_group_overlaps(df$interval) # 第二步:为每个分组分配字母(A、B、C...) group_map <- setNames(LETTERS[sort(unique(df$group_id))], sort(unique(df$group_id))) df$group_letter <- group_map[as.character(df$group_id)] # 第三步:处理跨组情况——找出每个区间直接重叠的所有分组,合并字母 df$final_groups <- sapply(seq_len(nrow(df)), function(i) { # 找出当前区间所有直接重叠的区间 overlaps <- iv_overlaps(df$interval, df$interval[i]) # 获取这些重叠区间的所有唯一分组字母 unique_letters <- unique(df$group_letter[overlaps]) # 排序后合并为字符串 paste(sort(unique_letters), collapse = ", ") })
4. 查看结果
运行后,查看最终的分组标记结果:
select(df, Interval, Start, End, final_groups)
结果解释
- 无任何重叠的区间,
final_groups为单个字母(独立分组) - 直接/间接重叠的区间,共享至少一个字母分组
- 同时与多个独立分组区间重叠的区间,会显示多个字母(比如同时重叠A组和B组的区间,标记为"A, B")
内容的提问来源于stack exchange,提问作者Eduardo A. Sánches Torres
相关产品推荐
相关产品推荐

