我正在尝试创建一个变量,将一个值添加到其先前的值,然后在另一个变量发生变化时从1开始。
现在,我正在尝试使用shift和ifelse,但无济于事:
example <- ifelse(CountryID == shift(CountryID,1), 1,
1+shift(CountryID,1))
我认为这不起作用,因为变量的自引用性质。
答案 0 :(得分:2)
至少有两种方法可以看到这一点,我将通过以下示例数据进行演示:
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))
第一种方法是假设您希望在其他变量发生变化时重新启动,即使更改时的值已在集合中较早发生。
如果是这种情况,您可以考虑来自&#34; data.table&#34;的rleid
功能。观察计数器变量如何重置,即使先前出现的值在&#34; v1&#34;:
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
第二种观点是假设您正在寻找仅由另一个变量分组的累积计数,无论这些值是否是连续的。观察计数器如何继续处理&#34; v1&#34;。
中的重复值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