Creating a counting variable that restarts at 1
我正在尝试创建一个变量,该变量将其先前的值加一,然后在另一个变量更改时从 1 开始。
现在,我正在尝试使用 shift 和 ifelse,但无济于事:
1
2 |
example <- ifelse(CountryID == shift(CountryID,1), 1,
1+shift(CountryID,1)) |
我假设这不起作用,因为变量的自引用性质。
- 请展示一个小的可重现示例和预期输出,以便其他人更好地理解您的问题。
- 你在计算 CountryID 的频率吗?
- 我认为问题不在于 R,而在于您思考算法的方式
- 可能类似于 library(dplyr); df %>% group_by(CountryID) %>% mutate(Count = row_number())
至少有两种看待这个问题的方法,我将通过以下示例数据进行演示:
1
2 3 4 |
library(data.table)
DT <- data.table(v1 = c(1, 1, 2, 2, 2, 1, 1, 3, 3, 3, 1, 2), |
第一个是假设您想在另一个变量发生更改时随时重新启动,即使更改时的值已在集合中较早出现。
如果是这种情况,您可以考虑”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 |
来源:https://www.codenong.com/34449102/