删除R

时间:2018-03-28 12:05:40

标签: r

我有一个包含重叠网站的数据框,我希望能够根据此规则删除这些重叠网站。

结束(B)>开始(A)&结束(A)>开始(B)然后我们删除站点B

例如,

   Chrom        Start   End          
  scaffold_98   8309   8313    
  scaffold_98   8311   8320      
  scaffold_98   8811   8815   

在这种情况下,我应删除网站(8311,8320),因为它与(8309,8313)重叠。 当我们处理大数据时,有没有一种快速的方法。

2 个答案:

答案 0 :(得分:0)

假设您的df是根据开始列排序的,这可能有效:

remove <- vector()
for (i in 2:nrow(df)){
  if(df[i,3] > df[i-1, 2] && df[i-1, 3] > df[i, 2]) {
    remove <- append(remove, i)
  }
}

df[-remove,]

答案 1 :(得分:0)

在这里使用GenomicRanges并不是必需的,但我建议将其用于涉及基因组坐标的更复杂的操作。它是一个非常强大的库,专为这类操作而设计。

以下是使用findOverlaps::GenomicRanges的解决方案。

  1. 加载库。

    library(GenomicRanges);
    
  2. 读入示例数据并转换为GRanges对象。

    df <- read.table(text =
        "Chrom        Start   End
      scaffold_98   8309   8313
      scaffold_98   8311   8320
      scaffold_98   8811   8815   ", header = T)
    
    gr <- makeGRangesFromDataFrame(df);
    
  3. 使用findOverlaps选择非重叠区域。

    gr[unique(findOverlaps(gr, type = "any", select = "first"))];
    #GRanges object with 2 ranges and 0 metadata columns:
    #         seqnames       ranges strand
    #            <Rle>    <IRanges>  <Rle>
    #  [1] scaffold_98 [8309, 8313]      *
    #  [2] scaffold_98 [8811, 8815]      *
    #  -------
    #  seqinfo: 1 sequence from an unspecified genome; no seqlengths