2016-12-01 47 views
0

考慮這個序列中,這是我們能想到的是「事件之間的時間」Sessionize數字序列成重置一次累計達到閾值

x <- c(5, 40, 3, 6, 0, 9, 0, 4, 5, 18, 2, 4, 3, 2)

我想這些組成桶組30,但桶重置。期望的結果:

output <- c(0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2)

這是因爲,當我們到了一個累積30,我們「復位」,並開始重新計數。因此,我們下降到零,並開始累計加入,直到我們達到30 ...(3 + 6 + 0 ...),這發生在我們到達x[10] == 18時。

+0

那麼,哪裏還有問題嗎? –

回答

3

一種選擇是使用Reduce()計算累積總和在這裏你可以設置sum爲零,如果超過某個閾值:

cumsum(Reduce(function(x, y) if(x < 30) x + y else y, x, acc = T) >= 30) 
# [1] 0 1 1 1 1 1 1 1 1 2 2 2 2 2 
+1

這是一個優雅的+1和一個在非常相似的'sql'問題[這裏](http://stackoverflow.com/q/40918252/2572423)發佈這個檢查 - 不幸的是,沒有原生的'Reduce'功能在Teradata中。 – JasonAizkalns

+0

我不認爲這是正確的。嘗試使用'x < - c(5,40,3,6,0,22,0,4,5,18,2,4,3,2)'。在22不重置。應該是'if(x <30)x + y else y'。 – sirallen

+0

@sirallen哦,是的。你是對的。感謝您指出了這一點。 – Psidom