在R

时间:2019-07-02 11:36:42

标签: r

所以我有不同的访客,每个访客都来过不止一次。

从就诊日期开始,我得到了每个患者的就诊差距。

我想根据他们的差距为每位患者的每次就诊分配情节。对于Gap=0(即任何新患者的第一次就诊),Episode=1。如果为Gap>20,则为Episode=previous episode+1;如果为Gap<=20,则为Episode=previous Episode。对于新患者,整个事情再次开始。我想在不使用R的情况下执行此操作,最好在dplyr中使用。

数据:

Df <- data.frame(Visitors = c("V1","V1","V1","V1","V1","V1","V1","V2","V2","V2","V2","V2","V2","V3"),
Gap=c(0,6,18,35,43,9,11,0,3,67,98,12,2,0))

这是预期的表:

Visitors Gap Episodes
    V1     0    1
    V1     6    1
    V1    18    1
    V1    35    2
    V1    43    3
    V1     9    3
    V1    11    3
    V2     0    1
    V2     3    1
    V2    67    2
    V2    98    3
    V2    12    3
    V2     2    3
    V3     0    1

1 个答案:

答案 0 :(得分:0)

这是dplyr解决方案。在按访问者将向量Df分成几组之后,它会累计计算出大于20的缺口。

require(dplyr)
Df %>% group_by(Visitors) %>% mutate(episode=cumsum(Gap>20)+1)
# A tibble: 14 x 3
# Groups:   Visitors [3]
   Visitors   Gap episode
   <fct>    <dbl>   <dbl>
 1 V1           0       1
 2 V1           6       1
 3 V1          18       1
 4 V1          35       2
 5 V1          43       3
 6 V1           9       3
 7 V1          11       3
 8 V2           0       1
 9 V2           3       1
10 V2          67       2
11 V2          98       3
12 V2          12       3
13 V2           2       3
14 V3           0       1

这是执行相同操作的基本R解决方案:

Df$ep<-unlist(sapply(split(Df, Df$Visitors),function(x) cumsum(x[,"Gap"]>20)+1))