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" 中的
中先前出现的值,观察 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 |