R中的组中的每个更改加一

mil*_*lan 3 r

我正在尝试改变这个

data.frame(id=c(1,1,1,1,1,2,2), val=c('a','a','b','a','a','a','b'))
  id val
1  1   a
2  1   a
3  1   b
4  1   a
5  1   a
6  2   a
7  2   b
Run Code Online (Sandbox Code Playgroud)

进入

  id val
1  1   1
2  1   1
3  1   2
4  1   3
5  1   3
6  2   1
7  2   2
Run Code Online (Sandbox Code Playgroud)

对于每个id,值val均以1开头,val更改时以1递增。

tmf*_*mnk 5

一种dplyr可能是:

df %>%
 group_by(id) %>%
 mutate(val = with(rle(as.numeric(val)), rep(seq_along(lengths), lengths)))

     id   val
  <dbl> <int>
1     1     1
2     1     1
3     1     2
4     1     3
5     1     3
6     2     1
7     2     2
Run Code Online (Sandbox Code Playgroud)

使用rleid()from 的相同想法data.table

df %>%
 group_by(id) %>%
 mutate(val = rleid(val))
Run Code Online (Sandbox Code Playgroud)