2013-10-02 34 views
1

在向量元素極端值I有一個這樣的載體:查找中的R

x<-c(-0.193,-0.126,-0.275,-0.375,-0.307,-0.347,-0.159,-0.268,-0.013,0.070,0.346, 
0.376,0.471,0.512,0.291,0.554,0.185,0.209,0.057,0.058,-0.157,-0.291,-0.509, 
-0.534,-0.239,-0.389,0.060,0.250,0.279,0.116,0.052,0.201,0.407,0.360,0.065, 
-0.167,-0.572,-0.984,-1.044,-1.039,-0.831,-0.584,-0.425,-0.362,-0.154,0.207, 
0.550,0.677,0.687,0.856,0.683,0.375,0.298,0.581,0.546,0.098,-0.081) 

我想每次連續> = 5倍的值是< -0.5到找到最低數目的位置。在該示例中,值爲-1.044

我該如何找到它?

我所做的是這樣的:

xx<-ifelse(x>.5,1,NA) 
xx 

aa<-rle(xx) 
zz <- rep(FALSE, length(xx)) 
zz[sequence(aa$lengths) == 1] <- aa$lengths >= 5 & aa$values == 1 
zz 

但我只是找到的第一個值的位置,而不是極端。

任何幫助?

+3

類似這樣的問題,只是問代碼有可能被關閉。請分享您嘗試過的以及爲什麼它不能正常工作。否則,這聽起來像你希望我們爲你做你的工作! (看看'rle',而你在它) – Justin

+1

我試過使用rle,但我只是能夠找到5個連續值開始的位置。不確定我是否可以使用rle。需要一個提示如何找到極值。 – Mart

回答

2

感謝您發佈您嘗試過的內容。

我只用一個邏輯比較爲xx

xx <- x < -0.5 

那麼你的RLE邏輯就變成了:

aa <- rle(xx) 
zz <- aa$lengths >= 5 & aa$values 

從那裏,識別zz其值爲true和使用cumsum獲得x(這是過於簡化,因爲只有一次實例,但你得到的照片)的痕跡:

first <- which(zz) 
idxs <- cumsum(aa$lengths[1:first]) 
min(x[idxs[first-1]:idxs[first]]) 

在你有多個匹配的情況下,first將長度> 1。在這種情況下,一個載體,使一個功能,您可以將其apply到矢量:

myfun <- function(y) { 
    idxs <- c(0, cumsum(aa$lengths[1:y])) 
    min(x[idxs[y]:idxs[y+1]]) 
} 

set.seed(20) 
x <- rnorm(100) 
xx <- x < -0.5 
aa <- rle(xx) 
zz <- aa$lengths >= 3 & aa$values 
first <- which(zz) 

sapply(first, myfun) 
+0

謝謝你回覆@Justin,但是你的解決方案給了我價值,而我正在尋找價值的位置。所以我試圖在極端值 – Mart

+0

的位置上獲得56x FALSE和1x TRUE的輸出向量,我敢打賭,這是你可以弄清楚的東西......查看'which.min'。 – Justin

0

與A功能內部應用功能:

find.val <- function(x,threshold,n,all=T){ 
    tmp <- rle(x < threshold) 
    cs <- cumsum(tmp$lengths) 
    dfcs <- data.frame(indices=c(0,cs[-length(cs)])+1,l=cs) 
    pos <- (apply(dfcs,1,function(y) which.min(x[y[1]:y[2]])+y[1]-1))[tmp$values==1 & tmp$lengths >= n] 
    if(all==T) return(pos) 
    pos[which.min(x[pos])] 

}

,如果你設置的所有= T你得到所有匹配,否則只有最低匹配的位置。 例子:

find.val(x,-0.5,5,all=T)