You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 11:39:47