我正在尝试创建一个函数来在我的数据的每一行中找到“局部最大值”,但如果它们不是连续“最高”最大值的至少 20%,则忽略。
我用来寻找局部最大值的函数:
which(diff(sign(diff(Gene name)))==-2)+1
但我想修改它并仅在其他最大值至少为最高值的 20% 时才设置选择。
这是我的数据:
Name Mo Tue Wen Thu Fr Sat Sun
Mark 0 32 53 11 0 33 52
Ettin 22 51 31 0 0 1 0
Gerard 36 0 13 0 111 33 0
Marcus 0 44 31 10 0 2 0
这是我的函数得到的输出:
Name Mo Tue Wen Thu Fr Sat Sun
Mark 0 0 1 0 0 0 1 ## Two local maximas
Ettin 0 1 0 0 0 1 0 ## Two local maximas (Should be one!)
Gerard 1 0 1 0 1 0 0 ## Three local maximas (Should be two!)
Marcus 0 1 0 0 0 1 0 ## Two local maximas (Should be one!)
对于 3 行,输出不正确,因为单元格 (Ettin,Sat) & (Gerard, Wen) & (Marcus, Sat) 中的值甚至不接近最高值的至少 20%。
这就是我希望通过新功能获得的:
Name Mo Tue Wen Thu Fr Sat Sun
Mark 0 0 1 0 0 0 1
Ettin 0 1 0 0 0 0 0
Gerard 1 0 0 0 1 0 0
Marcus 0 1 0 0 0 0 0
这样的函数可以写吗?
if(master[j,i]>master[j,i-1]) {
if(master[j,i] > 0.2*max(master [j,])) {
mas_max[j,i] <- 1 ## Setting maxima
mas_max[j,i-1] <- 0 ## Removing potential maxima before
}
}
这是我创建的一个循环,但它不是获得预期结果的最佳方式。
最佳答案
如果你的局部最大值在
ind <- which(diff(sign(diff(GeneName)))==-2)+1
然后可以得到不低于最高20%的thresholds的指标
ind[GeneName[ind] >= 0.2 * max(GeneName[ind])]
另外,请注意 ==-2
不会发现属于平台的局部最大值,例如它不会发现 c(0,10,10,0) - 不是确定这是否是一个问题,但我认为最好指出这一点。
关于r - 查找 "local maximas"但忽略小于最高值 20% 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22934249/