【问题标题】:grouping overlapping regions based on a clustering factor in R根据 R 中的聚类因子对重叠区域进行分组
【发布时间】:2022-11-23 02:09:07
【问题描述】:

使用 data.table 包中的 foverlaps 函数,我得到重叠区域(它只显示 25 行,但它超过 50,000 行),我想根据以下标准对每个 id 的重叠区域进行分组: 如果它们具有相同的 ID 和属于相同或不同组的重叠区域,则:

  1. 将它们全部分组,2) 扩展范围(即 start = min(重叠项集)和 end = max(重叠项集)),以及 3) 放置最高分组的名称。 例如,给定数据集:
    dt <- data.table::data.table(
    ID=c("1015_4_1_1","1015_4_1_1","1015_4_1_1","103335_0_1_2","103335_0_1_2",
    "103335_0_1_2","11099_0_1_1","11099_0_1_1","11099_0_1_1","11099_0_1_1","11099_0_1_1", 
    "11702_0_1_1","11702_0_1_1","11702_0_1_1","11702_0_1_5","11702_0_1_5","11702_0_1_5",
    "140331_0_1_1","140331_0_1_1","140331_0_1_1","14115_0_1_7","14115_0_1_7", 
    "14115_0_1_7","14115_0_1_8","14115_0_1_8"),
    start=c(193,219,269,149,149,163,51,85,314,331,410,6193,6269,6278,6161,6238,6246,303,304,316,1525,1526,1546,1542,1543),
    end=c(307,273,399,222,235,230,158,128,401,428,507,6355,6337,6356,6323,6305,6324,432,396,406,1603,1688,1612,1620,1705),
    group=c("R7","R5","R5","R4","R5","R6","R7","R5","R4","R5","R5","R5","R6","R4","R5","R6","R4","R5","R4","R6","R4","R5","R6","R4","R5"),
    score=c(394,291,409,296,319,271,318,252,292,329,252,524,326,360,464,340,335,515,506,386,332,501,307,308,443)
    )
    

    预期结果是:

    #  1015_4_1_1   193  399    R5   409
    #  103335_0_1_2   149  235    R5   319
    #  11099_0_1_1    51  158    R7   318
    #  11099_0_1_1   314  507    R5   329
    #  11702_0_1_1  6193 6356    R5   524
    #  11702_0_1_5  6161 6324    R5   464
    #  140331_0_1_1   303  432    R5   515
    #  14115_0_1_7  1525 1705    R5   501
    

    请注意,对于每个 ID,可能存在相互不重叠的区域子组,例如在“11099_0_1_1”中,第 7 行和第 8 行被分组在一个子组中,其余部分在另一个子组中。

    我没有使用 GenomicRangesIRanges 的经验,并且在另一条评论中读到 data.table 通常更快。因此,由于我期望有很多重叠区域,所以我从 data.table 开始使用 foverlaps,但我不知道如何进行。我希望你能帮助我,非常感谢你提前

【问题讨论】:

  • 为什么 11702_0_1_5 不在 464 的解决方案中?那是和11702_0_1_1 一样的 ID 吗?而且第一组不就是最高分394吗?
  • 你是对的,我编辑了我的问题

标签: r dplyr group-by data.table iranges


【解决方案1】:

你可以试试:

library(data.table)

dt <- dt[, IDx := sub('_.*', '', ID)][
  , IDy := cumsum(fcoalesce(+(start > (shift(cummax(end), type = 'lag') + 1L)), 0L)), by = IDx][
    , .(ID = ID[which.max(score)],
        start = min(start), end = max(end),
        group = group[which.max(score)], 
        score = max(score)),
    by = .(IDx, IDy) 
    ][, c('IDx', 'IDy') := NULL]

输出:

dt

             ID start  end group score
1:   1015_4_1_1   193  399    R5   409
2: 103335_0_1_2   149  235    R5   319
3:  11099_0_1_1    51  158    R7   318
4:  11099_0_1_1   314  507    R5   329
5:  11702_0_1_1  6161 6356    R5   524
6: 140331_0_1_1   303  432    R5   515
7:  14115_0_1_7  1525 1705    R5   501

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-17
    • 2019-07-30
    • 2014-11-03
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    相关资源
    最近更新 更多