R:如果差异超过阈值,则累计总和

时间:2017-10-18 14:18:40

标签: r vector cumsum

我有一个数字向量

x <- c(0, 28, 59, 89, 0, 15, 16, 0, 35, 31)
#[1] 0 0 31 30 0 15 16 0 35 31

我想计算它的累积总和,以获得特殊条件。给出:

month_vec <- seq(as.Date("2009-02-01"), length = 10, by = "1 month") - 1
day_vec   <- as.numeric(substr(month_vec, 9, 10))
# > day_vec
#[1] 31 28 31 30 31 30 31 31 30 31

如果之前元素的差异大于或等于cumsum(x)中的值,我只想day_vec

结果应如下所示:

my_custom_cumsum(x)
#[1] 0 0 31 61 0 15 16 0 35 66

由于x[4]等于day_vec[4]x[3]x[4]会被记录。但是,x[6]x[7]不会因为它们小于day_vec中各自的位置而受到限制。但是x[9]x[10]应该再次开头 - 换句话说:如果与之前元素的差异小于day_vec 中的值,则应重置cumsum 。有没有人知道如何优雅地解决这个问题?

1 个答案:

答案 0 :(得分:4)

我会使用用于子集化的逻辑索引来完成此操作。对于x的所有元素应该是“cumumed”并且其余的都是假的。

idx <- x >= day_vec

现在您可以使用它来计算cumsum并将其分配给x:

中的正确元素
x[idx] <- cumsum(x[idx])
x
#[1]  0  0 31 61  0 15 16