R 如何指示事件前后发生的事件数

R 如何指示事件前后发生的事件数,r,R,对于任何给定的行,我想知道在y事件(-)之前或y事件(+)之后,该行距离我的数据集中第一次发生y事件有多少个x事件 由于它与我的数据集有关,x事件是df$type=“ES”所在的行。y事件是df$type=“PH”首次出现的事件 我找到了一个有效的解决方案,其中我使用了case_when(),但我想知道是否有更优雅的解决方案 库(tidyverse) #我所拥有的 df类型在起始日期之前、起始日期之前、起始日期之前 #>1 ES-34 2019-01-01 #>2 OT-2 4 2019-01-

对于任何给定的行,我想知道在y事件(-)之前或y事件(+)之后,该行距离我的数据集中第一次发生y事件有多少个x事件

由于它与我的数据集有关,x事件是df$type=“ES”所在的行。y事件是df$type=“PH”首次出现的事件

我找到了一个有效的解决方案,其中我使用了case_when(),但我想知道是否有更优雅的解决方案

库(tidyverse)
#我所拥有的
df类型在起始日期之前、起始日期之前、起始日期之前
#>1 ES-34 2019-01-01
#>2 OT-2 4 2019-01-05
#>3 ES-14 2019-01-15
#>4 PH 0 4 2019-02-19
#>5 ES 1 4 2019-03-11
#>6 PH 2 4 2019-03-22
#>7 OT 3 4 2019-04-20
#>8 ES 4 2019-05-01
#非优雅解
df%>%
突变(EScumsum=cumsum(type==“ES”),
在什么情况下(
前后PH<0~as.double(x=EScumsum-(EScumsum[匹配(“PH”),类型)]+1),
bef_aft_PH==0~as.double(x=EScumsum-EScumsum),
前后PH>0~as.double(x=EScumsum-EScumsum[匹配(“PH”,.$type)])
))
#>类型bef_aft_PH rownum_at_PH date EScumsum ES_bef_aft_PH
#>1 ES-34 2019-01-01 1-2
#>2 OT-242019-01-05 1-2
#>3 ES-14 2019-01-15 2-1
#>4 PH 0 4 2019-02-19 2 0
#>5 ES 1 4 2019-03-11 3 1
#>6 PH 2 4 2019-03-22 3 1
#>7 OT 3 4 2019-04-20 3 1
#>8 ES 4 2019-05-01 4 2

在as.double()中,我没有预料到需要包装case_的所有RHS参数,所以我想知道为什么我也需要这样做。

不清楚。你能解释一下前两行怎么有
ES\u bef\u aft\u PH=-2
?不清楚。你能解释一下前两行怎么有
ES\u bef\u aft\u PH=-2
df %>%
  mutate(ES_PH1cumsum  = cumsum(type == "ES" | bef_aft_PH == 0)) %>%
  mutate(ES_bef_aft_PH = ES_PH1cumsum - ES_PH1cumsum[match(0, .$bef_aft_PH)])


  type bef_aft_PH rownum_at_PH       date ES_PH1cumsum ES_bef_aft_PH
1   ES         -3            4 2019-01-01            1            -2
2   OT         -2            4 2019-01-05            1            -2
3   ES         -1            4 2019-01-15            2            -1
4   PH          0            4 2019-02-19            3             0
5   ES          1            4 2019-03-11            4             1
6   PH          2            4 2019-03-22            4             1
7   OT          3            4 2019-04-20            4             1
8   ES          4            4 2019-05-01            5             2