关于 r:创建一个在 1 处重新开始的计数变量


Creating a counting variable that restarts at 1

我正在尝试创建一个变量,该变量将其先前的值加一,然后在另一个变量更改时从 1 开始。

现在,我正在尝试使用 shift 和 ifelse,但无济于事:

1
2
example <- ifelse(CountryID == shift(CountryID,1), 1,
1+shift(CountryID,1))

我假设这不起作用,因为变量的自引用性质。


至少有两种看待这个问题的方法,我将通过以下示例数据进行演示:

1
2
3
4
library(data.table)

DT <- data.table(v1 = c(1, 1, 2, 2, 2, 1, 1, 3, 3, 3, 1, 2),
                 v2 = c(6, 7, 5, 4, 6, 8, 1, 2, 9, 4, 6, 5))

第一个是假设您想在另一个变量发生更改时随时重新启动,即使更改时的值已在集合中较早出现。

如果是这种情况,您可以考虑"data.table" 中的rleid 函数。即使对于 "v1":

中先前出现的值,观察 counter 变量是如何被重置的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DT[, N := sequence(.N), by = rleid(v1)][]
#     v1 v2 N
#  1:  1  6 1
#  2:  1  7 2
#  3:  2  5 1
#  4:  2  4 2
#  5:  2  6 3
#  6:  1  8 1
#  7:  1  1 2
#  8:  3  2 1
#  9:  3  9 2
# 10:  3  4 3
# 11:  1  6 1
# 12:  2  5 1

第二种观点是假设您正在寻找仅由另一个变量分组的累积计数,无论这些值是否连续。观察计数器如何继续为 "v1" 中的重复值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DT[, N := sequence(.N), by = v1][]
#     v1 v2 N
#  1:  1  6 1
#  2:  1  7 2
#  3:  2  5 1
#  4:  2  4 2
#  5:  2  6 3
#  6:  1  8 3
#  7:  1  1 4
#  8:  3  2 1
#  9:  3  9 2
# 10:  3  4 3
# 11:  1  6 5
# 12:  2  5 4