假设我的数字很少,我想知道如何找到低于临界数的连续值。例如,在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.谢谢。
答案 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