这可能不是很复杂,但我对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语句尝试这个失败
非常感谢任何帮助。
答案 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