堆在床上的锉刀从R内

堆在床上的锉刀从R内,r,bioinformatics,R,Bioinformatics,我在R中有一个数据表,我想计算重叠窗口的数量。这本质上是一个pileup命令,似乎可以使用bedtools完成,但我不知道如何在不离开R的情况下完成 是否已经有一个R函数来实现这一点,或者对什么可能是有效的方法有任何建议 如果有帮助的话,这里有一个我正在尝试做的小例子。提前谢谢 输入: chrom start end 1 1 100 1 50 150 返回: chrom start end count

我在R中有一个数据表,我想计算重叠窗口的数量。这本质上是一个pileup命令,似乎可以使用bedtools完成,但我不知道如何在不离开R的情况下完成

是否已经有一个R函数来实现这一点,或者对什么可能是有效的方法有任何建议

如果有帮助的话,这里有一个我正在尝试做的小例子。提前谢谢

输入:

chrom    start     end
1        1         100
1        50        150
返回:

chrom      start    end    count
1        1          49      1
1        50         100     2
1        101        150     1

您可以使用GRanges,首先我们创建GRanges对象:

library(GenomicRanges)
gr = GRanges(seqnames=c(1,1),IRanges(start=c(1,50),end=c(100,150)))
现在计算返回rle对象的覆盖率:

COV = coverage(gr)
class(COV)

[1] "SimpleRleList"
attr(,"package")
[1] "IRanges"
as.data.frame(COV2bg(COV))
  seqnames start end width strand value
1        1     1  49    49      *     1
2        1    49 100    52      *     2
3        1   100 150    51      *     1
这告诉你的是“1”,有49次1,51次2和50次1。这或多或少是您所需要的,只是您需要将它放在data.frame表单中

COV
RleList of length 1
$`1`
integer-Rle of length 150 with 3 runs
  Lengths: 49 51 50
  Values :  1  2  1
要处理此问题,最好编写一个函数:

COV2bg = function(cov_obj){

  allchr = lapply(names(cov_obj),function(i){
              ends = cumsum(cov_obj[[i]]@lengths)
              GRanges(
                  seqnames=i,
                  IRanges(start=c(1,ends[-length(ends)]),end=ends),
                  value = cov_obj[[i]]@values
                   )
              })

 Reduce(c,allchr)
}
然后将其应用到rle对象上:

COV = coverage(gr)
class(COV)

[1] "SimpleRleList"
attr(,"package")
[1] "IRanges"
as.data.frame(COV2bg(COV))
  seqnames start end width strand value
1        1     1  49    49      *     1
2        1    49 100    52      *     2
3        1   100 150    51      *     1

虽然大多数链接答案使用
findOverlaps
或类似的
GRanges
上下文,但对我来说,最简单的方法是使用
覆盖范围。很容易来回切换,选择最方便或最高效的框架

库(基因组范围)
gr seqnames strand |分数
#>              | 
#>   [1]        1      1-49      * |         1
#>   [2]        1    50-100      * |         2
#>   [3]        1   101-150      * |         1
#>   -------
#>seqinfo:1个来自未指定基因组的序列
#如果您想要一个data.table
DT seqnames开始-结束宽度钢绞线分数
#> 1:        1     1  49    49      *     1
#> 2:        1    50 100    51      *     2
#> 3:        1   101 150    50      *     1
#转换回田庄:
带(DT,格兰杰(序号名称,伊朗(开始,结束),分数=分数))
#>具有3个范围和1个元数据列的GRanges对象:
#>seqnames strand |分数
#>              | 
#>   [1]        1      1-49      * |         1
#>   [2]        1    50-100      * |         2
#>   [3]        1   101-150      * |         1
#>   -------
#>seqinfo:1个来自未指定基因组的序列;没有长度

由(v0.3.0)于2020年6月25日创建。

请在此处查看答案:可能重复:相关:,带有nice
数据。表
answers.cool。从未意识到您可以将覆盖范围对象转换为GRanges