R创建每个组随时间推移的条件递增分类变量

tkqqtvp1  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(103)

我有一个随时间变化的 Dataframe ,并按组划分。有一个与用户状态相关的二进制字段。用户可以在一段时间内保持此状态,也可以退出。我希望创建一个特定于每个用户的计数器,该计数器在用户每次进入和重新进入状态期间时递增。状态周期开始之间的每个时间点都保持相同的值。
所需输出Status_Count

Date        User_ID   Status  Status_Count
01/01/2022     1        0        0
01/02/2022     1        0        0
01/03/2022     1        1        1
01/04/2022     1        1        1
01/05/2022     1        1        1
01/06/2022     1        0        0
01/07/2022     1        0        0
01/08/2022     1        1        2
01/09/2022     1        1        2
01/10/2022     1        0        0
01/11/2022     1        0        0
01/12/2022     1        0        0
01/01/2022     2        0        0
01/02/2022     2        1        1
01/03/2022     2        1        1
01/04/2022     2        1        1
01/05/2022     2        0        0
01/06/2022     2        0        0
01/07/2022     2        1        2
01/08/2022     2        1        2
01/09/2022     2        0        0
01/10/2022     2        0        0
01/11/2022     2        1        3
01/12/2022     2        0        0

示例数据:

Date <- rep(seq(as.Date('2022-01-01'), as.Date('2022-12-01'), by = "month"), 2)
User_ID <- c(rep.int(1, 12), rep.int(2, 12))
Status<- c(0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0)
Status_Counter <- c(0, 0, 1, 1, 1, 0, 0, 2, 2, 0, 0, 0, 0, 1, 1, 1, 0, 0, 2, 2, 0, 0, 3, 0)
Example_Data <- data.frame(Date, User_ID, Status, Status_Counter)

我尝试编码这个:

library(dplyr)

Example_Data <- Example_Data %>%
  group_by(User_ID) %>%
  dplyr::mutate(Counter = case_when(
      Event == 1 & (Status != lag(Status, 1) | is.na(lag(Status, 1))) ~ cumsum(Status),
      Event == 1 ~ cumsum(Status),
      TRUE ~ 0))
wz3gfoph

wz3gfoph1#

Example_Data %>%
  mutate(counter = Status*cumsum(Status > lag(Status, default = 0)), .by = User_ID)

结果

Date User_ID Status Status_Counter counter
1  2022-01-01       1      0              0       0
2  2022-02-01       1      0              0       0
3  2022-03-01       1      1              1       1
4  2022-04-01       1      1              1       1
5  2022-05-01       1      1              1       1
6  2022-06-01       1      0              0       0
7  2022-07-01       1      0              0       0
8  2022-08-01       1      1              2       2
9  2022-09-01       1      1              2       2
10 2022-10-01       1      0              0       0
11 2022-11-01       1      0              0       0
12 2022-12-01       1      0              0       0
13 2022-01-01       2      0              0       0
14 2022-02-01       2      1              1       1
15 2022-03-01       2      1              1       1
16 2022-04-01       2      1              1       1
17 2022-05-01       2      0              0       0
18 2022-06-01       2      0              0       0
19 2022-07-01       2      1              2       2
20 2022-08-01       2      1              2       2
21 2022-09-01       2      0              0       0
22 2022-10-01       2      0              0       0
23 2022-11-01       2      1              3       3
24 2022-12-01       2      0              0       0

相关问题