【问题标题】:Filtering R data.frame based on multiple constraints基于多个约束过滤 R data.frame
【发布时间】:2016-07-13 10:45:01
【问题描述】:

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

我有一个包含 78,812 行的数据框。在PeakName 列中,我的标识符指向我的数据中的“峰值”。只有 13,000 个峰值,因此每个峰值通常在数据框中出现几次。对于每个唯一的 PeakName,有多个 motifs 与它们相关联的不同 PValue 分数。每个主题还有一个start 和一个stop 位置。

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

  1. 对于每个 PeakName,我找到具有最低 PValue 的 motif 并将其添加到新数据帧中
  2. 使用图案的start 和stop 位置,我发现是否有任何图案与刚刚添加到新数据框中的图案重叠。如果有,我会删除这些作为添加到新数据框的可能性。
  3. 如果此PeakName 有任何剩余motifs,我返回步骤1,并重复此过程直到没有更多可能的motifs。
  4. 注意:如果有两个等于 PValue 的峰,而这个值是当前的最低值,我会选择“主要”主题之一,而不是“次要”主题之一。

示例(简化)数据:

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

任何建议都将不胜感激,因为我一直对如何编写一些东西来做到这一点感到困惑,我认为这是一项相当简单的任务,但一直在逃避我。谢谢!

【问题讨论】:

  • 我认为您没有在头脑中解释允许您产生该输出的规则。我们是否应该对主要和次要主题赋予不同的权重?为什么Secondary 3 9 7 Peak2 不符合收录条件?为什么选择了第一个重叠(第 1 行和第 2 行)中的第二行,但选择了第二个重叠(第 3 行和第 4 行)的第一行。编程需要的不仅仅是理解语法。最关键的是,它需要清晰、明确的问题描述。
  • Secondary 3 9 7 Peak2 不符合规则 (4) 的包含条件,因为它与 Peak2 中的 Primary 主题具有相同的 PValue,但在这种情况下,我会将优先级放在 Primary 而不是次要的。选择第二行是因为所有的 Peak1 PValues,它是最低的。该行首先由第二行中存在的最小 PValue 选择。这与第一行、第四行和第五行重叠,这就是为什么这些行未包含在最终输出中的原因。抱歉,我认为我的解释比看起来更清楚

标签: r dataframe subset min overlap


【解决方案1】:

您可能需要进行一些清理以捕捉边缘情况,例如领带。注意使用“帮助”列来处理主要/次要主题选择:

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,]
    }
}

【讨论】:

  • 如果我有 6 个不同的主题而不是两个,那么在处理主题选择时如何更改“助手”列的任何建议?在我的一个文件中,我有:“Tbr_prim_8bp”、“Tbr_prim_12bp”、“Tbr_sec_8bp”、“Tbr_sec_12bp”、“Smad3_prim”、“Smad3_sec”,这就是我希望在这种情况下优先考虑它们的顺序。
  • 以适当的顺序添加 0.1, 0.2, ..., 0.6
  • 我想我对 ifelse 语句的工作原理有点困惑?您是否暗示我需要为我的每个主题设置一个唯一标识符,并按照我想要对主题进行排名的顺序伴随 0.1、0.2 等?所以我需要tmp$helper &lt;- tmp$Pvalue + ifelse(tmp$Motif=="Tbr_prim_8bp", 0.1, 0) 和tmp$helper &lt;- tmp$Pvalue + ifelse(tmp$Motif=="Tbr_prim_12bp", 0.2, 0) 等?
  • 您可以使用矢量代替:motif_lookup &lt;- seq(0.1,0.6,0.1); names(motif_lookup) &lt;- c("Tbr_prim_8bp", "Tbr_prim_12bp", ...); tmp$helper &lt;- tmp$Pvalue + motif_lookup[tmp$Motif]
猜你喜欢
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
相关资源
最近更新 更多