2014-09-22 24 views
1

這可能不是很複雜,但我被if語句弄糊塗了。我有一個大的數據集,我在尋找對低於0.1以下兩個值的mimima的指數是一個例子:R:找到0以下的局部最小值的所有元素

x <- c(-1, 2, 3, -1, -2, 1, 2, -1) 

我試圖找到低於0的值的索引並且在兩個(或更多)後續值低於0的情況下,最低值的索引。所以我希望得到的是這樣的

[1] 1 5 8 

矢量我試着通過觀察導數解決這個問題:

which(diff(sign(diff(test)))==2)+1 

但是這並沒有給我什麼,我需要,因此我嘗試使用for循環嘗試失敗,如果語句

任何幫助,非常感謝。與tapply

回答

2

一種方法:

idx <- which(x < 0) 
unname(tapply(idx, c(0L, cumsum(diff(idx) > 1L)), function(i) i[which.min(x[i])])) 
# 1 5 8 
3
x <- c(-1, 2, 3, -1, -2, 1, 2, -1) 
y = diff(x) 
which((c(0,y)*c(-y,0)>=0) & ((c(0,y) + c(-y, 0))<0)) 

# [1] 1 5 8 

來形容我的回答是:which((c(0,y)*c(-y,0)>=0))是找到當地的最大值和最小值。那麼結合這與第二期只需選擇當地min

如果你有興趣在低於零值,您可以添加其他條件

which((c(0,y)*c(-y,0)>=0) & ((c(0,y) + c(-y, 0))<0) &(x<0)) 

如果要選擇本地max,你可以改變它

which((c(0,y)*c(-y,0)>=0) & ((c(0,y) + c(-y, 0))>0)) 
# [1] 3 7 
0

使用rle

的方法
localmin <- function(x) {rlex <- rle(x<0) 
        rlex$values <- seq_along(rlex$values) *rlex$values 
        ix <- inverse.rle(rlex) 
        ixt <- tapply(seq_along(ix)[ix>0], ix[ix>0], function(i,xi) i[which.min(xi[i])],xi=x) 
        unname(ixt) 
        } 


localmin(x) 
# [1] 1 5 8