根据多个约束过滤R data.frame

时间:2016-03-25 16:32:11

标签: r dataframe subset min overlap

所以我仍然是R的新手,我一直在寻找如何根据多个约束和计算过滤数据帧,以便返回一个新的数据帧。我环顾四周,我知道如何使用%in%进行过滤,并且我已经使用了很多次,但我正在寻找一些过滤数据集的建议,超出一个或两个约束,可以使用该语法。

我有一个78,812行的数据框。在列PeakName中,我的标识符指向我的数据中的“峰值”。只有13,000个峰值,因此每个峰值在数据帧中经常出现几次。对于每个唯一PeakName,有多个motifs具有与之关联的不同PValue分数。每个主题还有startstop位置。

我的目标是创建一个新的数据框,其中包括:

  1. 为每个PeakName我找到motif PValue,并将其添加到新数据框
  2. 使用startstop位置作为主题,我发现是否有任何图案与刚添加到新数据帧的图案重叠。如果有,我删除那些作为添加到新数据帧的可能性。
  3. 如果此motifs剩余PeakName,我将返回步骤1,并重复此过程,直到不再有motifs为止。
  4. 注意:如果有两个峰值相等PValue,其中此值目前是最低值,我会选择“主要”主题而不是“次要”主题1。
  5. 示例(简化)数据:

    Motif      Start   Stop    PValue     PeakName
    Primary    4       10      5          Peak1
    Primary    5       11      4          Peak1
    Secondary  12      18      8          Peak1
    Secondary  8       16      6          Peak1
    Primary    12      18      9          Peak1
    Secondary  3       9       7          Peak2
    Primary    5       11      7          Peak2
    

    以上数据的所需输出:

    Motif      Start   Stop    PValue     PeakName
    Primary    5       11      4          Peak1
    Secondary  12      18      8          Peak1
    Primary    5       11      7          Peak2
    

    任何建议都会非常感激,因为我对如何写一些东西感到困惑,这是一个我认为应该相当简单的任务,但一直在躲避我。谢谢!

1 个答案:

答案 0 :(得分:0)

你可能想要清理一下以捕获诸如领带之类的边缘情况。请注意使用“帮助”列来处理主要/次要主题选择:

df2 <- {}
for (peak in unique(df$PeakName)) {
    tmp <- subset(df, PeakName==peak)
    tmp$helper <- tmp$Pvalue + ifelse(tmp$Motif=="S", 0.1, 0)

    while (nrow(tmp) > 0) {
        ind <- which.min(tmp$helper)
        df2 <- rbind(df2, tmp[ind,])
        remove <- (tmp$Start >= tmp$Start[ind] & tmp$Start <= tmp$Stop[ind]) | (tmp$Stop >= tmp$Start[ind] & tmp$Stop <= tmp$Stop[ind])
        tmp <- tmp[!remove,]
    }
}