创建一个在1处重新启动的计数变量

时间:2015-12-24 07:41:33

标签: r

我正在尝试创建一个变量,将一个值添加到其先前的值,然后在另一个变量发生变化时从1开始。

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

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

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

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