【问题标题】:Find value of overlapping ranges of integers in R that are NOT times or genomes查找 R 中不是时间或基因组的整数重叠范围的值
【发布时间】:2020-08-21 06:15:25
【问题描述】:

我正在尝试计算海洋物种和人类活动的重叠深度范围。因此,对于每个物种,它都有一个最小和最大深度,我想有效地计算与 4 个不同活动的深度范围重叠的深度范围。我认为这可以通过data.table::foverlaps()IRanges::findOverlaps() 完成,但我无法弄清楚如何计算重叠的值,而不仅仅是它是真还是假。因此,如果物种 D 出现在 40-100m 深度,而活动 1 发生在 0-50m 深度,则重叠为 10m。

例如,

min_1 <- 0 
max_1 <- 50
min_2 <- 0 
max_2 <- 70
min_3 <- 0
max_3 <- 200
min_4 <- 0
max_4 <- 500

activities <- data.frame(min_1, max_1, min_2, max_2, min_3, max_3, min_4, max_4)

spp_id <- c("a", "b", "c", "d")
spp_depth_min <- c(0, 20, 30, 40)
spp_depth_max <- c(200, 500, 50, 100)

species <- data.frame(spp_id, spp_depth_min, spp_depth_max)

## data.table approach?

setDT(activities)
setDT(species)

foverlaps(species, activities, ...) ## Or do I need to subset each activity and do separate calculations? 

写一个函数会更容易吗?我真的很陌生!这似乎应该是一件常见/容易的事情,我不知道为什么它让我这么困惑

【问题讨论】:

    标签: r overlap


    【解决方案1】:

    我将您的活动表重组为长表格,以便您可以同时进行所有 4 项计算。然后overlaps join就完成了,接下来就可以根据结果计算重叠长度了。

    activities <- data.table(
      act = c('act_1','act_2','act_3','act_4'),
      a_min = c(min_1, min_2, min_3, min_4),
      a_max = c(max_1, max_2, max_3, max_4)
      )
    
    spp_id <- c("a", "b", "c", "d")
    spp_depth_min <- c(0, 20, 30, 40)
    spp_depth_max <- c(200, 500, 50, 100)
    
    species <- data.table(spp_id, spp_depth_min, spp_depth_max)
    
    setkey(activities,a_min,a_max)
    
    ol <- foverlaps(species, activities, 
      by.x = c('spp_depth_min','spp_depth_max'), 
      by.y = c('a_min','a_max')
      )
    ol[,ol_length := pmin(spp_depth_max,a_max)-pmax(spp_depth_min,a_min)]
    ol
    

    【讨论】:

    • 现在更有意义了,谢谢@pseudospin!
    【解决方案2】:

    为了完整起见,这里有一个版本,它使用 non-equi join 而不是调用foverlaps() 函数来查找重叠。此外,使用了 OP 提供的原始数据,即宽格式的activities

    library(data.table)
    vals <- c("min", "max")
    melt(setDT(activities), measure.vars = patterns(vals), variable.name = "activity", value.name = vals)[
      setDT(species), on = .(max >= spp_depth_min, min <= spp_depth_max), 
        .(activity, spp_id, overlap = pmin(x.max, spp_depth_max) - pmax(x.min, spp_depth_min))]
    
        activity spp_id overlap
     1:        1      a      50
     2:        2      a      70
     3:        3      a     200
     4:        4      a     200
     5:        1      b      30
     6:        2      b      50
     7:        3      b     180
     8:        4      b     480
     9:        1      c      20
    10:        2      c      20
    11:        3      c      20
    12:        4      c      20
    13:        1      d      10
    14:        2      d      30
    15:        3      d      60
    16:        4      d      60
    

    说明

    melt() 用于将activities 从宽格式重塑为长格式,同时具有多个度量变量。

    非等值连接的条件可以通过一些布尔代数推导出如下:

    两个闭区间 [a1, a2] 和 [b1, b2] 重叠如果

    b21 OR a21

    如果这个布尔表达式被否定,两个区间重叠:

    NOT( b21 OR a21 ) =

    NOT( b21 ) AND NOT( a21 ) =

    b2 >= a1 AND a2 >= b1

    连接识别所有重叠的区间对(对于给定的数据集,4 x 4 = 16 个案例)。每对重叠区域的起点由两个区间中较大的起点给出,终点由两个区间中较小的终点给出。重叠的长度是限制点之间的差异。

    【讨论】:

      猜你喜欢
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      相关资源
      最近更新 更多