基于R tidyverse按列筛选重叠区间内高分行
解决方法
步骤1:标准化区间的起始和结束
首先根据direction生成统一的start和end列,确保所有区间都是起始值 ≤ 结束值:
- 当
direction为+时,区间是col1到col2,所以start=col1,end=col2 - 当
direction为-时,区间是col2到col1,所以start=col2,end=col1
步骤2:给重叠区间分组
先按start排序,然后判断每个区间是否和前一个区间重叠,通过累积求和生成重叠组的编号:
- 如果当前区间的起始值 ≤ 前一个区间的结束值,说明两者重叠,属于同一组
- 否则开启新的组
步骤3:每组保留最高分的行
对每个重叠组,筛选出score最大的行,最后保留原始的4列即可。
完整代码
library(tidyverse) df <- tibble(col1=c(1,10,100,40,1000), col2=c(15,20,50,80,2000), direction=c("+","+","-","+","+"), score=c(50,100,300,10,300)) result <- df %>% # 标准化区间 mutate( start = if_else(direction == "+", col1, col2), end = if_else(direction == "+", col2, col1) ) %>% # 按起始值排序,确保重叠判断准确 arrange(start) %>% # 生成重叠组编号 mutate( # 判断当前区间是否和前一个重叠 overlap_with_prev = start <= lag(end, default = -Inf), # 累积求和生成组号:不重叠时加1,开启新组 group = cumsum(!overlap_with_prev) ) %>% # 按组筛选最高分的行 group_by(group) %>% filter(score == max(score)) %>% ungroup() %>% # 保留原始需要的列 select(col1, col2, direction, score) result
输出结果
#> # A tibble: 3 × 4 #> col1 col2 direction score #> <dbl> <dbl> <chr> <dbl> #> 1 10 20 + 100 #> 2 100 50 - 300 #> 3 1000 2000 + 300
内容的提问来源于stack exchange,提问作者LDT
相关产品推荐
相关产品推荐

