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

在R中查找坐标范围重叠行:多数据框的唯一/交集范围提取

用dplyr处理区间重叠筛选方案

针对你的三个tibble数据框,我们可以通过标记来源+区间重叠判断+分组筛选的步骤来实现需求,以下是具体代码和解释:

前置准备:统一数据格式

首先给每个数据框添加来源标识,再合并成一个总表,方便后续统一处理:

library(tibble)
library(dplyr)
library(purrr)

# 给每个数据框加来源标记(替换成你的真实数据即可)
df1 <- df1 %>% mutate(source = "df1")
df2 <- df2 %>% mutate(source = "df2")
df3 <- df3 %>% mutate(source = "df3")

# 合并所有数据
all_df <- bind_rows(df1, df2, df3)

核心工具:区间重叠判断函数

两个区间[a1,a2]和[b1,b2]重叠的标准条件是:a1 <= b2 且 b1 <= a2,我们先封装成函数:

is_overlapping <- function(x, y) {
  x$coord1 <= y$coord2 & y$coord1 <= x$coord2
}

1. 筛选仅单个数据框、无重叠的行

遍历每一行,检查是否和其他来源的所有区间都不重叠:

single_only <- all_df %>%
  rowwise() %>% # 按行逐个处理
  mutate(
    # 检查当前行是否和其他来源的行有重叠
    has_overlap = any(is_overlapping(cur_data(), filter(all_df, source != source)))
  ) %>%
  filter(!has_overlap) %>% # 保留无重叠的行
  ungroup() %>% # 取消按行分组
  select(-has_overlap) # 移除辅助计算列

2. 筛选两两数据框间重叠的行

先标记每行对应的重叠来源,再筛选仅和一个其他数据框重叠的行:

# 先标记每行的重叠来源集合和数量
overlap_info <- all_df %>%
  rowwise() %>%
  mutate(
    overlapping_sources = list(
      unique(filter(all_df, source != source & is_overlapping(cur_data(), cur_data()))$source)
    ),
    overlap_count = length(overlapping_sources)
  ) %>%
  ungroup()

# 提取仅两两重叠的行
pairwise_overlap <- overlap_info %>%
  filter(overlap_count == 1) %>%
  select(-overlapping_sources, -overlap_count)

3. 筛选三个数据框均重叠的行

筛选那些重叠来源包含另外两个数据框的行:

triple_overlap <- overlap_info %>%
  filter(
    map_lgl(overlapping_sources, ~ setequal(.x, setdiff(c("df1", "df2", "df3"), source)))
  ) %>%
  select(-overlapping_sources, -overlap_count)

注意事项

  • 如果你的数据量极大,rowwise()的效率可能不高,可以考虑用data.table的非等值连接优化,但上述代码完全符合dplyr的使用场景。
  • 确保coord1始终小于等于coord2,如果有相反的情况,先添加mutate(coord1 = pmin(coord1, coord2), coord2 = pmax(coord1, coord2))处理。

内容的提问来源于stack exchange,提问作者Corrector

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:45:30