我正在尝试创建一个函数来在我的数据的每一行中找到“局部最大值”,但忽略它们是否至少不是连续“最高”最大值的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)& (马库斯,周六)甚至没有接近至少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
}
}
这是我创建的一个循环,但它不是获得所需结果的最佳方式。
答案 0 :(得分:5)
如果您的本地最大值位于
ind <- which(diff(sign(diff(GeneName)))==-2)+1
然后你可以得到不低于最高值的20%的阈值指数
ind[GeneName[ind] >= 0.2 * max(GeneName[ind])]
另外,请注意==-2
不会发现属于高原的局部最大值,例如它不会发现c(0,10,10,0) - 不确定这是否是一个问题,但最好指出这一点。