首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中查找具有重叠范围的行

在R中查找具有重叠范围的行
EN

Stack Overflow用户
提问于 2022-12-04 08:53:59
回答 1查看 62关注 0票数 2

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

代码语言:javascript
复制
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中指定我想要根据重叠范围过滤的内容。有一条命令我丢失了

唯一的这些峰值的范围不与其他数据帧的峰值范围重叠。

代码语言:javascript
复制
> unique

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

在df1-df2之间常见

代码语言:javascript
复制
>df1df2 
peak       coord1  coord2
peak1       100     250
peak5       120     300
peak3      1000    1250
peak7       900    1850

在df1-df3之间常见

代码语言:javascript
复制
peak       coord1  coord2
peak3       1000    1250
peak8       900   2000

,然后在df1-df2-df3之间常见。

EN

回答 1

Stack Overflow用户

发布于 2022-12-04 18:15:01

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

代码语言:javascript
复制
# load packages
library(tidyverse)
library(ivs)

你的数据

代码语言:javascript
复制
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来创建间隔

代码语言:javascript
复制
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")

绑定数据

代码语言:javascript
复制
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))

检查数据之间的重叠间隔

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74674069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档