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

我的数据是这样的:

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

每行的“时间”列中都有唯一的时间戳。数据已经对此进行了排序。我想创建一个新列,为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值的索引应重新开始。我该怎么办?

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

这是数据表解决方案:

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)))
本文链接:https://www.f2er.com/3068842.html

大家都在问