Home > Back-end >  Count cumulative and sequential values of the same sign in R
Count cumulative and sequential values of the same sign in R

Time:11-03

I'm looking for the equivalent code in R to this post in python for adding a column that cumulative counts the number of positives and negative values in the preceeding column.

I've found many examples of cumulative sums or something more complex, but I would just like to count the number of positives and negatives in a row that resets whenever the sign changes. See sample code.

library(dplyr)
df <- data.frame(x = c(0.5, 1, 6.5, -2, 3, -0.2, -1))

My expected output is this:

df <- data.frame(x = c(0.5, 1, 6.5, -2, 3, -0.2, -1), 
                 z = c(1,2,3,-1,1,-1,-2))

I would like R to create column "z" with a mutate function to the dataframe df when it starts with just "x".

CodePudding user response:

You can try:

library(dplyr)

df %>%
  mutate(z = with(rle(sign(x)), sequence(lengths) * rep(values, lengths)))

     x  z
1  0.5  1
2  1.0  2
3  6.5  3
4 -2.0 -1
5  3.0  1
6 -0.2 -1
7 -1.0 -2

You may want to consider how zeroes should be treated as the above may need a modification if zeroes exist in your vector. Perhaps:

df %>%
   mutate(z = with(rle(sign(x)), sequence(lengths) * rep(values^(values != 0), lengths)))
  •  Tags:  
  • r
  • Related