繁体   English   中英

查找范围重叠的行

[英]Find rows with overlapping ranges

我有 3 个大数据框,如下所示:

library(tibble)

df1 <- tibble(peak=c("peak1","peak2","peak3"), 
              coord1=c(100,500,1000),
              coord2=c(250,700,1250))


df2 <- tibble(peak=c("peak5","peak6","peak7"), 
              coord1=c(120,280,900),
              coord2=c(300,400,1850))


df3 <- tibble(peak=c("peak8","peak9","peak10"), 
              coord1=c(900,3000,5600),
              coord2=c(2000,3400,5850))

df1
#> # A tibble: 3 × 3
#>   peak  coord1 coord2
#>   <chr>  <dbl>  <dbl>
#> 1 peak1    100    250
#> 2 peak2    500    700
#> 3 peak3   1000   1250
df2
#> # A tibble: 3 × 3
#>   peak  coord1 coord2
#>   <chr>  <dbl>  <dbl>
#> 1 peak5    120    300
#> 2 peak6    280    400
#> 3 peak7    900   1850
df3
#> # A tibble: 3 × 3
#>   peak   coord1 coord2
#>   <chr>   <dbl>  <dbl>
#> 1 peak8     900   2000
#> 2 peak9    3000   3400
#> 3 peak10   5600   5850

我是 R 的新手,我试图找到每个数据帧唯一的坐标 (coord1, coord2) 内的重叠区域、两个数据帧之间的重叠以及所有数据帧内的重叠。

我想要这些数据框作为输出。 目前我很难找到如何在 R、dplyr 中指定我想根据重叠范围进行过滤。 我缺少一个命令

独特的是这些峰的范围不与其他数据帧的峰范围重叠

> unique

peak    coord1  coord2
peak6    280     400
peak9    3000    3400
peak10   5600    5850

df1-df2 之间共有

>df1df2 
peak       coord1  coord2
peak1       100     250
peak5       120     300
peak3      1000    1250
peak7       900    1850

df1-df3 之间共有

peak       coord1  coord2
peak3       1000    1250
peak8       900   2000

然后在 df1-df2-df3 之间通用

老实说,我不明白你搜索的最终目标是什么。 无论如何,有一个解决方案使用ivs方法和 ivs 包中的函数来检查向量的间隔。 这不是一个优雅的解决方案,它没有考虑同一数据帧内的重叠向量。

# load packages
library(tidyverse)
library(ivs)

您的数据

df1 <- tibble(peak=c("peak1","peak2","peak3"), 
              coord1 = c(100, 500, 1000),
              coord2 = c(250, 700, 1250))


df2 <- tibble(peak=c("peak5","peak6","peak7"), 
              coord1 = c(120, 280, 900),
              coord2 = c(300, 400, 1850))


df3 <- tibble(peak=c("peak8","peak9","peak10"), 
              coord1 = c(900, 3000, 5600),
              coord2 = c(2000, 3400, 5850))

使用函数iv_overlaps来创建间隔

check_df1_df2 <- df1 %>%
      mutate(any_overlap = iv_overlaps(range, df2$range),
             check = "df1-df2")

check_df1_df3 <- df1 %>%
      mutate(any_overlap = iv_overlaps(range, df3$range),
             check = "df1-df3")

check_df2_df1 <- df2 %>%
      mutate(any_overlap = iv_overlaps(range, df1$range),
             check = "df2-df1")

check_df2_df3 <- df2 %>%
      mutate(any_overlap = iv_overlaps(range, df3$range),
             check = "df2-df3")

check_df3_df1 <- df3 %>%
      mutate(any_overlap = iv_overlaps(range, df1$range),
             check = "df3-df1")

check_df3_df2 <- df3 %>%
      mutate(any_overlap = iv_overlaps(range, df2$range),
             check = "df3-df2")

绑定数据框

final_conclusion <- bind_rows(check_df1_df2, check_df1_df3, check_df2_df1, check_df2_df3, check_df3_df1, check_df3_df2, .id = "df_check") %>% 
      group_by(peak) %>% 
      mutate(overlapping_sum = sum(any_overlap))

检查数据帧之间的重叠间隔

overlapping <- final_conclusion %>% 
      filter(overlapping_sum > 0) %>% 
      pivot_wider(id_cols = peak, names_from = check, values_from = range)

> overlapping

# A tibble: 5 × 7
# Groups:   peak [5]
  peak     `df1-df2`    `df1-df3`   `df2-df1`   `df2-df3`   `df3-df1`   `df3-df2`
  <chr>    <iv<dbl>>    <iv<dbl>>   <iv<dbl>>   <iv<dbl>>   <iv<dbl>>   <iv<dbl>>
1 peak1   [100, 250)   [100, 250)    [NA, NA)    [NA, NA)    [NA, NA)    [NA, NA)
2 peak3 [1000, 1250) [1000, 1250)    [NA, NA)    [NA, NA)    [NA, NA)    [NA, NA)
3 peak5     [NA, NA)     [NA, NA)  [120, 300)  [120, 300)    [NA, NA)    [NA, NA)
4 peak7     [NA, NA)     [NA, NA) [900, 1850) [900, 1850)    [NA, NA)    [NA, NA)
5 peak8     [NA, NA)     [NA, NA)    [NA, NA)    [NA, NA) [900, 2000) [900, 2000)

检查数据帧之间的非重叠间隔

not_overlapping <- final_conclusion %>% 
      filter(overlapping_sum == 0) %>% 
      pivot_wider(id_cols = peak, names_from = check, values_from = range)

> not_overlapping
# A tibble: 4 × 7
# Groups:   peak [4]
  peak    `df1-df2`  `df1-df3`  `df2-df1`  `df2-df3`    `df3-df1`    `df3-df2`
  <chr>   <iv<dbl>>  <iv<dbl>>  <iv<dbl>>  <iv<dbl>>    <iv<dbl>>    <iv<dbl>>
1 peak2  [500, 700) [500, 700)   [NA, NA)   [NA, NA)     [NA, NA)     [NA, NA)
2 peak6    [NA, NA)   [NA, NA) [280, 400) [280, 400)     [NA, NA)     [NA, NA)
3 peak9    [NA, NA)   [NA, NA)   [NA, NA)   [NA, NA) [3000, 3400) [3000, 3400)
4 peak10   [NA, NA)   [NA, NA)   [NA, NA)   [NA, NA) [5600, 5850) [5600, 5850)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM