仅子集那些间隔不在另一个data.frame内的行

仅子集那些间隔不在另一个data.frame内的行,r,dataframe,overlapping-matches,R,Dataframe,Overlapping Matches,如果test$chr==control$chr,我如何比较长度不等的两个数据帧(test和control),并根据三个条件从test中删除该行 ii)测试$start和测试$end在控制$start和控制$end的范围内 iii)测试$CNA和控制$CNA相同 test = R_level logp chr start end CNA Gene 2 7.079 11 1159 1360 gain

如果test$chr==control$chr,我如何比较长度不等的两个数据帧(test和control),并根据三个条件从test中删除该行 ii)测试$start和测试$end在控制$start和控制$end的范围内 iii)测试$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
当您说“排除变量”时,我假定您的意思是要删除满足这些条件的行

如果是这样,你就快到了。以下方面应起作用:

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

data1 <- data1[!exclude_bool , ]
排除布尔数据2[,5]&
数据1[,5]<数据2[,4]&
数据1[,6]==数据2[,6]

数据1这里有一种方法可以使用
data.table
中的
foverlaps()

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
require(data.table)#v1.9.4+

欢迎来到Stackoverflow!请进一步说明您的问题。在第2行,您的意思是
data1[,4]>data2[,5]&
(不是daat2)对吗?很抱歉输入错误。它实际上是data2[,5]。我想删除满足上述以下标准的行。谢谢解码器。但似乎两个数据帧的长度不一样。警告消息:1:在data1[,3]==data2[,3]:较长对象长度不是较短对象长度的倍数2:在data1[,4]>data2[,5]:较长对象长度不是较短对象长度的倍数3:在data1[,5]data1[,3]==data2[,3]
是什么意思?因为在R中,这种语法是按元素比较值。对于
data1[,4]>data2[,5]
,情况也是如此:您希望如何进行比较?如果
data1[,5]
的最大值大于
data2[,4]
的最大值,则data1为测试,data2为控制。如果a)data1[,3]等于data2[,3]b)如果测试的开始和结束(data1)在控制的开始和结束(data2)c)的范围内,并且如果data1[,6]也等于data2[,6],我想在测试中筛选行。那么它们仍然需要具有相同的行数。我认为您必须更新您的问题,以准确反映您正在尝试做的事情。但是,如果行数不相等,该怎么办。我们如何强制R执行比较?在我的例子中,测试和控制中的行数不相等。