所以我仍然是R的新手,我一直在寻找如何根据多个约束和计算过滤数据帧,以便返回一个新的数据帧。我环顾四周,我知道如何使用%in%
进行过滤,并且我已经使用了很多次,但我正在寻找一些过滤数据集的建议,超出一个或两个约束,可以使用该语法。
我有一个78,812行的数据框。在列PeakName
中,我的标识符指向我的数据中的“峰值”。只有13,000个峰值,因此每个峰值在数据帧中经常出现几次。对于每个唯一PeakName
,有多个motifs
具有与之关联的不同PValue分数。每个主题还有start
和stop
位置。
我的目标是创建一个新的数据框,其中包括:
PeakName
我找到motif
PValue
,并将其添加到新数据框start
和stop
位置作为主题,我发现是否有任何图案与刚添加到新数据帧的图案重叠。如果有,我删除那些作为添加到新数据帧的可能性。motifs
剩余PeakName
,我将返回步骤1,并重复此过程,直到不再有motifs
为止。 PValue
,其中此值目前是最低值,我会选择“主要”主题而不是“次要”主题1。示例(简化)数据:
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
任何建议都会非常感激,因为我对如何写一些东西感到困惑,这是一个我认为应该相当简单的任务,但一直在躲避我。谢谢!
答案 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,]
}
}