子集只有那些行,其间隔不属于另一个data.frame内(Subset only those row

2019-10-21 16:26发布

我怎样才能比较不等长度的两个数据帧(测试和对照),并且基于三个标准,ⅰ)如果测试$ CHR ==控制$ CHRⅱ)试验$试验开始和结束$在于从测试中删除行在控制开始$和控制$端ⅲ)试验$ CNA的范围和控制$ CNA相同。

    test = 
        R_level  logp   chr start   end     CNA    Gene
        2     7.079     11  1159    1360    gain   Recl,Bcl
        11    2.4       12  6335    6345    loss   Pekg
        3     19        13  7180    7229    loss   Sox1

control =

  R_level    logp   chr  start  end     CNA    Gene
        2     5.9     11  1100  1400    gain   Recl,Bcl 
        2     3.46    11  1002  1345    gain    Trp1
        2     6.4     12  6705  6845    gain    Pekg
        4     7       13  6480  8129    loss    Sox1

结果应该是这个样子

result =
     R_level     logp   chr start   end     CNA     Gene
          11      2.4    12  6335   6345    loss   Pekg

Answer 1:

下面是使用单程foverlaps()data.table

require(data.table) # v1.9.4+
dt1 <- as.data.table(test)
dt2 <- as.data.table(control)
setkey(dt2, chr, CNA, start, end)

olaps = foverlaps(dt1, dt2, nomatch=0L, which=TRUE, type="within")
#    xid yid
# 1:   1   2
# 2:   3   4

dt1[!olaps$xid]
#    R_level logp chr start  end  CNA Gene
# 1:      11  2.4  12  6335 6345 loss Pekg

阅读?foverlaps ,看看范例章节以获得更多信息。

另外,您也可以使用GenomicRanges包。 但是,你可能要筛选基于CNA的重叠区域(AFAICT)合并之后。



Answer 2:

当你说“排除变量”,我假设你的意思是你想删除满足这些条件的行。

如果是的话,就快成功了。 下面应该工作:

exclude_bool <- data1[,3] == data2[,3] &
data1[,4] > data2[,5] &
data1[,5] < data2[,4] &
data1[,6] == data2[,6] 

data1 <- data1[!exclude_bool , ]


文章来源: Subset only those rows whose intervals does not fall within another data.frame