2016-12-23 61 views
0

假設我有很少的數字,我想知道如何在關鍵數字以下找到連續的值。例如,在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

rleid選項這是一個家庭作業的問題?這似乎是一組非常具體的要求。你有沒有特別的應用? –

+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) 
0

這裏是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