2013-10-02 2 views
1

У меня есть вектор, как это:Нахождение экстремальных значений в векторных элементов в 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 являются подлинными и использовать 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, однако ваше решение дает мне значение, в то время как я искал позицию значения. Поэтому я пытаюсь получить выходной вектор с 56x FALSE и 1x TRUE в позиции крайнего значения – Mart

+0

Я уверен, это то, что вы можете выяснить ... см. 'Who.min'. – Justin

0

функции с применять функцию внутри:

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) 
Смежные вопросы