Olivia
Olivia

Reputation: 814

Group by each increasing sequence in data frame

If I have a data frame with a column of monotonically increasing values such as:

x
1
2
3
4
1
2
3
1
2
3
4
5
6
1
2

How do I add a column to group each increasing sequence that results in:

x   y
1   1
2   1
3   1
4   1
1   2
2   2
3   2
1   3
2   3
3   3
4   3
5   3
6   3
1   4
2   4

I can only think of using a loop which will be slow.

Upvotes: 1

Views: 92

Answers (2)

talat
talat

Reputation: 70336

I would use diff and compute the cumulative sum:

df$y <- c(1, cumsum(diff(df$x) < 0 ) + 1)

> df
   x y
1  1 1
2  2 1
3  3 1
4  4 1
5  1 2
6  2 2
7  3 2
8  1 3
9  2 3
10 3 3
11 4 3
12 5 3
13 6 3
14 1 4
15 2 4

Upvotes: 3

PKumar
PKumar

Reputation: 11128

You may choose cumsum function to do it.

> x <- c(1,2,3,4,1,2,3,1,2,4,5,1,2)
> cumsum(x==1)
 [1] 1 1 1 1 2 2 2 3 3 3 3 4 4

Upvotes: 3

Related Questions