【问题标题】:Finding overlap in dataframe ranges in R在 R 中查找数据框范围的重叠
【发布时间】:2020-08-26 22:18:13
【问题描述】:

我有两个床文件作为 R 中的数据框,我想将所有重叠区域相互映射(类似于最接近的床工具能够做的事情)。

床甲:

chr   start   end
 2       100     500
 2       200     250
 3       275     300

床:

chr    start    end
  2       210      265
  2       99       106
  8       275      290

睡不着:

chr   start.A   end.A  start.B  end.B
 2       100     500      210      265
 2       100     500      99       106
 2       200     250      210      265

现在,我发现this 非常相似的问题,建议使用 iRanges。使用建议的方式似乎可行,但我不知道如何将输出转换为像“BedOut”这样的数据框。

【问题讨论】:

    标签: r overlap iranges


    【解决方案1】:

    另一个data.table 选项使用foverlaps

    setkeyv(BedA, names(BedA))
    setkeyv(BedB, names(BedB))
    ans <- foverlaps(BedB, BedA, nomatch=0L)
    setnames(ans, c("start","end","i.start","i.end"), c("start.A","end.A","start.B","end.B"))
    

    输出:

       chr start.A end.A start.B end.B
    1:   2     100   500      99   106
    2:   2     100   500     210   265
    3:   2     200   250     210   265
    

    数据:

    library(data.table)
    BedA <- fread("chr   start   end
    2       100     500
    2       200     250
    3       275     300")
    
    BedB <- fread("chr    start    end
    2       210      265
    2       99       106
    8       275      290")
    

    【讨论】:

      【解决方案2】:

      这是使用data.table 包的解决方案。

      library(data.table)
      
      chr = c(2,2,3)
      start.A = c(100, 200, 275)
      end.A = c(500, 250, 300)
      df_A = data.table(chr, start.A, end.A)
      
      chr = c(2,2,8)
      start.B = c(210, 99, 275)
      end.B = c(265, 106, 290)
      df_B = data.table(chr, start.B, end.B)
      

      首先,内连接键 chr 上的数据表:

      df_out = df_B[df_A, on="chr", nomatch=0]
      

      然后过滤重叠区间:

      df_out = df_out[(start.A>=start.B & start.A<=end.B) | (start.B>=start.A & start.B<=end.A)]
      setcolorder(df_out, c("chr", "start.A", "end.A", "start.B", "end.B"))
      
         chr start.A end.A start.B end.B
      1:   2     100   500     210   265
      2:   2     100   500      99   106
      3:   2     200   250     210   265
      

      【讨论】:

      • 尤其是一张床文件非常大(420000 和 22000 行)。并且事先梳理两个文件超出了我的记忆(类似于dplyr的inner_join函数)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多