如何选择低于临界值的连续值?

时间:2016-12-23 22:37:30

标签: r indexing

假设我的数字很少,我想知道如何找到低于临界数的连续值。例如,在Mydata中,对于单个值<10,找到它们;对于连续值<10,找到总和。

Mydata = c(-10,11,-100,-8,-6,-5,15,10,22,-8.5,88,76.5,42,-85,9,100)
which(Mydata<10)
[1]  1  3  4  5  6 10 14 15

我们可以看到3,4,5,6和14,15是连续数字,1,10是单数。所以最终的结果应该是

-10,-119,-8.5,-76

我想知道如何在R.谢谢。

2 个答案:

答案 0 :(得分:3)

好的,在这种情况下你可以使用以下技巧。将diff应用于索引将在一对索引连续的情况下产生值1,并且每当新的连续值块开始时,将产生非1。您可以在逻辑向量中标识这些块启动,并沿其运行cumsum以生成块编号向量。然后,tapply可以为您计算总和:

consecutive.below <- function(x, threshold) {
    o <- which(x < threshold)
    if (length(o)==0) return(x[o])
    blocks <- cumsum(c(TRUE, diff(o) != 1))
    unname(tapply(x[o], blocks, sum))
}
consecutive.below(Mydata, 10)

答案 1 :(得分:0)

以下是来自rleid

data.table选项
library(data.table)
i1 <- Mydata < 10
as.vector(tapply(Mydata*i1, rleid(i1)*i1, FUN = sum)[-1])
#[1]  -10.0 -119.0   -8.5  -76.0