1

我有一个这样的向量:

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

但后来我只找到第一个值的位置,而不是极端值。

有什么帮助吗?

4

2 回答 2

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)
于 2013-10-02T15:48:15.457 回答
0

内部带有 apply 函数的函数:

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])]

}

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

find.val(x,-0.5,5,all=T)
于 2013-10-04T08:45:06.473 回答