在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
相关产品推荐
相关产品推荐

