关于 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))

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

  • 请展示一个小的可重现示例和预期输出,以便其他人更好地理解您的问题。
  • 你在计算 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),
                 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

来源:https://www.codenong.com/34449102/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9646.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?