R - 为由另一列分组的列中每次出现的值分配递增索引

R - Assign increasing index to every occurrence of a value in a column grouped by another column

我的数据是这样的:

Time| V1 | V2
T01 | A  | 1
T02 | A  | 1
T03 | A  | 2
T04 | A  | 2
T05 | A  | 3
T06 | A  | 3
T07 | A  | 4
T08 | A  | 4
T09 | A  | 1
T10 | A  | 1
T11 | A  | 2
T12 | A  | 2
T13 | A  | 3
T14 | A  | 3
T15 | A  | 4
T16 | A  | 4

每一行在 'Time' 列中都有一个唯一的时间戳。数据已经按此排序。我想创建一个新列,为 V2 分配一个递增的计数器,按 V1 分组。例如,V2中'1'第一次出现的所有行都应分配索引1。第二次出现'1'时,应分配索引2,依此类推......像这样:

Time| V1 | V2 | V3
T01 | A  | 1  | 1 
T02 | A  | 1  | 1
T03 | A  | 2  | 1
T04 | A  | 2  | 1
T05 | A  | 3  | 1
T06 | A  | 3  | 1
T07 | A  | 4  | 1
T08 | A  | 4  | 1
T09 | A  | 1  | 2
T10 | A  | 1  | 2
T11 | A  | 2  | 2
T12 | A  | 2  | 2
T13 | A  | 3  | 2
T14 | A  | 3  | 2
T15 | A  | 4  | 2
T16 | A  | 4  | 2

V2 的索引应按 V1 分组。因此,如果 V1 中的值发生变化,V3 中 V2 值的索引应该重新开始。我该怎么做?

这是一个数据table解决方案:

library(data.table)
setDT(dd)
dd[, temp := rleid(V2), by = .(V1)][, result := as.integer(factor(temp)), by = V2]
dd
#     V1 V2 V3 temp result
#  1:  A  1  1    1      1
#  2:  A  1  1    1      1
#  3:  A  2  1    2      1
#  4:  A  2  1    2      1
#  5:  A  3  1    3      1
#  6:  A  3  1    3      1
#  7:  A  4  1    4      1
#  8:  A  4  1    4      1
#  9:  A  1  2    5      2
# 10:  A  1  2    5      2
# 11:  A  2  2    6      2
# 12:  A  2  2    6      2
# 13:  A  3  2    7      2
# 14:  A  3  2    7      2
# 15:  A  4  2    8      2
# 16:  A  4  2    8      2
library(dplyr)
d %>%
    group_by(V1) %>%
    mutate(ind = with(rle(V2), rep(ave(values, values, FUN = seq_along), lengths)))