从中间找到最大值

时间:2013-06-13 21:42:14

标签: arrays r perl matrix

我必须从数据集的中间找到数据集的最接近的最大值。数据集可能如下所示:

46813471    2
46813481    2
46813491    2
46813501    2
46813511    2
46813521    2
46813531    3
46813541    2
46813551    2
46813561    2
46813571    2
46813581    2
46813591    2
46813601    2
46813611    2
46813621    2
46813631    3
46813641    9
46813651    14
46813661    20
46813671    32
46813681    45
46813691    58
46813701    69
46813711    87
46813721    96
46813731    104
46813741    102
46813751    96
46813761    86
46813771    75
46813781    65
46813791    51
46813801    35
46813811    24
46813821    14
46813831    9
46813841    8
46813851    5
46813861    4
46813871    5
46813881    5
46813891    4
46813901    3
46813911    3
46813921    3
46813931    3
46813941    3
46813951    2
46813961    1
46813991    2
46814001    2
46814011    2
46814021    2
46814031    2
46814041    2
46814051    2
46814061    2
46814071    1
46814091    2
46814101    2
46814111    2
46814121    2
46814131    2
46814141    2
46814151    2
46814161    2
46814171    2

请记住,实际数据集非常大,并且模式会重复。我如何从中间获得最接近的最大值,特定点,例如第1列中的行46813621?我从perl调用R,我可能会传入一个数组,这将有数据,我会指定一个索引。然后,R将从该点获得最大壁橱并返回perl索引和实际最大值。

真正感谢所有帮助。

2 个答案:

答案 0 :(得分:1)

据我所知,从turnpoints库中找到pastecs函数的最佳方法是找到这样的数据的局部最大值(我假设是一个时间序列)。

library(pastecs)
data <- read.table("Untitled.txt")
tp <- turnpoints(data[,2])

dist_from_middle <- function(x, middle) {
    sqrt((x-middle)^2)
}
peaks = extract(tp, pit=0)
distances = sapply(data[,1], dist_from_middle, middle=46813621)
data <- data.frame(data, peak = peaks, distance = distances)

peaks <- data[which(data$peak==1),]
#         V1  V2 peak distance
#7  46813531   3    1       90
#27 46813731 104    1      110
#42 46813881   5    1      260
#58 46814061   2    1      440
closest_peak <- peaks[which(peaks$distance==min(peaks$distance)),]
#        V1 V2 peak distance
#7 46813531  3    1       90

您的样本数据恰好说明了这种方法的一个缺陷,即有一个微小的局部最大值恰好接近您的参考点。您可以尝试通过指定峰的p值截止值来避免这种情况(p值由turnpoints生成):

sig_extrema <- data[tp$tppos[which(tp$proba < 0.05)],]
sig_maxima <- sig_extrema[which(sig_extrema$peak==1),]
closest_maxima <- sig_maxima[which(
    sig_maxima$distance==min(sig_maxima$distance)),]
#         V1  V2 peak distance
#27 46813731 104    1      110

这可能是您希望的数据点..

答案 1 :(得分:0)

正方向上最接近的局部最大值:

  wpos <- which( diff( X[ ( length(X)/2 ):length(X) ] ) < 0)[1]

负面方向:

  wneg <- which( diff( X[ ( length(X)/2 ):1 ] )    ) < 0)[1]  

 which.min(wpos, wneg)

高峰发现确实有其缺陷。