根据 ID 列创建具有第一个系列的连续计数的新列

Create New Column With Consecutive Count Of First Series Based on ID Column

我在医疗保健行业工作,我正在使用机器学习算法开发一个模型来预测患者何时不会出现在他们的约会中。我正在尝试创建一个新功能,它将是每个患者最近连续未出现的总和。我在 Whosebug 和其他资源上看了很多,但找不到我要找的东西。例如,如果患者在最近的两次约会中都没有出现,那么新特征的列中包含她 ID 的每一行都将填入 2。如果她 3 次未出现,但在最近一次约会中出现,则新列将填入 0。

我尝试将 plyr 的 ddply 与 cumsum 一起使用,但它没有给我想要的结果。我用过:

ddply(a, .(ID), transform, ConsecutiveNoshows = cumsum(Noshow))

这是一个示例数据集(“1”表示未出现):

ID  Noshow
 1       1
 1       1
 1       0
 1       0
 1       1
 2       0
 2       1
 2       1
 3       1
 3       0
 3       1
 3       1
 3       1

这是我想要的结果:

ID  Noshow  ConsecutiveNoshows
 1       1                   2
 1       1                   2
 1       0                   2
 1       0                   2
 1       1                   2
 2       0                   0
 2       1                   0
 2       1                   0
 3       1                   1
 3       0                   1
 3       1                   1
 3       1                   1
 3       1                   1

如有任何帮助,我将不胜感激。谢谢。

想法是 sum() 每个 ID0 出现之前 Noshow 的数量。

library(dplyr)
df %>%
  group_by(ID) %>%
  mutate(ConsecutiveNoshows = sum(!cumsum(Noshow == 0) >= 1))

给出:

#Source: local data frame [13 x 3]
#Groups: ID [3]
#
#      ID Noshow ConsecutiveNoshows
#   <int>  <int>              <int>
#1      1      1                  2
#2      1      1                  2
#3      1      0                  2
#4      1      0                  2
#5      1      1                  2
#6      2      0                  0
#7      2      1                  0
#8      2      1                  0
#9      3      1                  1
#10     3      0                  1
#11     3      1                  1
#12     3      1                  1
#13     3      1                  1