R:如果差异超过阈值,则累积和
R: Cumulative sum if difference over threshold
我有一个数字向量
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]
应该再次 cumsum - 换句话说: 如果之前元素的差异小于 day_vec
[= 中的值,则 cumsum 应该重置36=]。有人知道如何优雅地解决这个问题吗?
我会用一个用于子集化的逻辑索引来做到这一点。对于 x 的所有元素,应为 "cumsumed",其余元素应为 false。
idx <- x >= day_vec
现在您可以使用它来计算 cumsum 并将其分配给 x:
中的正确元素
x[idx] <- cumsum(x[idx])
x
#[1] 0 0 31 61 0 15 16
我有一个数字向量
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]
应该再次 cumsum - 换句话说: 如果之前元素的差异小于 day_vec
[= 中的值,则 cumsum 应该重置36=]。有人知道如何优雅地解决这个问题吗?
我会用一个用于子集化的逻辑索引来做到这一点。对于 x 的所有元素,应为 "cumsumed",其余元素应为 false。
idx <- x >= day_vec
现在您可以使用它来计算 cumsum 并将其分配给 x:
中的正确元素x[idx] <- cumsum(x[idx])
x
#[1] 0 0 31 61 0 15 16