【问题标题】:Subset only those rows whose intervals does not fall within another data.frame仅对间隔不属于另一个 data.frame 的行进行子集
【发布时间】:2015-03-22 10:59:36
【问题描述】:

如何比较两个长度不等的数据帧(测试和控制),并根据三个标准从测试中删除行,i) 如果 test$chr == control$chr ii) test$start 和 test$end 位于 control$start 和 control$end 的范围内 iii) test$CNA 和 control$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

【问题讨论】:

  • 欢迎来到 Stackoverflow!请进一步说明您的问题。
  • 在第 2 行,你的意思是 data1[,4] > data2[,5] &(不是 daat2)对吗?
  • 抱歉有错别字。它实际上是data2 [,5]。我想删除满足上述以下条件的行。

标签: r dataframe overlapping-matches


【解决方案1】:

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

如果是这样,您就快到了。以下应该有效:

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

data1 <- data1[!exclude_bool , ]

【讨论】:

  • 谢谢解码器..但似乎两个数据帧的长度不一样。警告消息: 1:在 data1[, 3] == data2[, 3] 中:较长的对象长度不是较短对象长度的倍数 2:在 data1[, 4] > data2[, 5] 中:较长的对象长度不是较短对象长度的倍数 3:在 data1[, 5]
  • 如果长度不同,则比较没有意义。你说data1[,3]==data2[,3]是什么意思?由于在 R 中,这种语法是逐元素比较值。 data1[,4] &gt; data2[,5] 也是如此:您希望如何进行比较? data1[,5]的最大值是否应该大于data2[,4]的最大值?
  • data1 是测试,data 2 是控制。如果 a) data1[,3] 等于 data2[,3] b) 如果测试的开始和结束(data1)在控制的开始和结束范围内(data2)c,我想过滤测试中的行) 并且如果 data1[,6] 也等于 data2[,6]。
  • 那么它们仍然需要具有相同的行数。我认为您必须更新您的问题以准确反映您正在尝试做的事情。
  • 但是如果行数不相等怎么办。我们如何强制 R 进行比较?在我的情况下,没有。测试和控制中的行数不相等。
【解决方案2】:

这是使用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

阅读?foverlaps 并查看示例部分了解更多信息。

或者,您也可以使用GenomicRanges 包。但是,在按重叠区域 (AFAICT) 合并后,您可能必须基于 CNA 进行过滤。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-07
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 2015-04-13
    相关资源
    最近更新 更多