R:找到所有低于0的局部极小值指标

R:找到所有低于0的局部极小值指标,r,if-statement,indexing,R,If Statement,Indexing,这可能不是很复杂,但我被if语句弄糊涂了。我有一个大的数据集,我正在寻找0以下两个值对的最小值的索引。以下是一个例子: x <- c(-1, 2, 3, -1, -2, 1, 2, -1) 我试图通过观察导数来解决这个问题: which(diff(sign(diff(test)))==2)+1 但这并不能满足我的需要,因此我尝试使用for循环和if语句时失败了 非常感谢您的帮助。使用tapply的一种方法: tapply的一种方法是: 如果要选择本地最大值,可以将其更改为 which(

这可能不是很复杂,但我被if语句弄糊涂了。我有一个大的数据集,我正在寻找0以下两个值对的最小值的索引。以下是一个例子:

x <- c(-1, 2, 3, -1, -2, 1, 2, -1)
我试图通过观察导数来解决这个问题:

which(diff(sign(diff(test)))==2)+1
但这并不能满足我的需要,因此我尝试使用for循环和if语句时失败了

非常感谢您的帮助。

使用tapply的一种方法:

tapply的一种方法是:

如果要选择本地最大值,可以将其更改为

which((c(0,y)*c(-y,0)>=0) & ((c(0,y) + c(-y, 0))>0))
# [1] 3 7
如果要选择本地最大值,可以将其更改为

which((c(0,y)*c(-y,0)>=0) & ((c(0,y) + c(-y, 0))>0))
# [1] 3 7
一种利用rle的方法

一种利用rle的方法

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) & ((c(0,y) + c(-y, 0))<0) &(x<0))
which((c(0,y)*c(-y,0)>=0) & ((c(0,y) + c(-y, 0))>0))
# [1] 3 7
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