I have this vector :
x = c(1,1,1,1,1,0,1,0,0,0,1,1)
And I want to do a cumulative sum for the positive numbers only. I should have the following vector in return:
xc = (1,2,3,4,5,0,1,0,0,0,1,2)
How could I do it?
I've tried : cumsum(x)
but that do the cumulative sum for all values and gives :
cumsum(x) [1] 1 2 3 4 5 5 6 6 6 6 7 8
The definition of the cumulative sum is the sum of a given sequence that is increasing or getting bigger with more additions. The real example of a cumulative sum is the increasing amount of water in a swing pool. Example: Input: 10, 15, 20, 25, 30. Output: 10, 25, 45, 70, 100.
Python numpy cumsum() syntax The axis parameter defines the axis along which the cumulative sum is calculated. If the axis is not provided then the array is flattened and the cumulative sum is calculated for the result array. The dtype parameter defines the output data type, such as float and int.
One option is
x1 <- inverse.rle(within.list(rle(x), values[!!values] <- (cumsum(values))[!!values])) x[x1!=0] <- ave(x[x1!=0], x1[x1!=0], FUN=seq_along) x #[1] 1 2 3 4 5 0 1 0 0 0 1 2
Or a one-line code would be
x[x>0] <- with(rle(x), sequence(lengths[!!values])) x #[1] 1 2 3 4 5 0 1 0 0 0 1 2
Here's a possible solution using data.table
v >= 1.9.5 and its new rleid
funciton
library(data.table) as.data.table(x)[, cumsum(x), rleid(x)]$V1 ## [1] 1 2 3 4 5 0 1 0 0 0 1 2
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With