R:找到0以下的局部最小值的所有指数

时间:2014-09-22 19:15:44

标签: r if-statement indexing

这可能不是很复杂,但我对if语句感到困惑。我有一个大型数据集,我正在寻找两个值低于0的对的mimima指数。下面是一个例子:

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

我试图找到低于0的值的索引,并且在两个(或更多)后续值低于0的情况下,索引是最低值。所以我想得到的是像这样的矢量

[1] 1 5 8

我试图通过查看衍生物来解决这个问题:

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

但这并没有给我我需要的东西,因此我试图用for循环和if语句尝试这个失败

非常感谢任何帮助。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

使用tapply的一种方法:

idx <- which(x < 0)
unname(tapply(idx, c(0L, cumsum(diff(idx) > 1L)), function(i) i[which.min(x[i])]))
# 1 5 8 

答案 2 :(得分: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