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

时间:2019-04-05 00:36:37

标签: r

对于任何给定的行,我想知道从我的数据集中第一次发生y事件(在y事件(-)之前或y事件( +)。

因为它与我的数据集有关,所以x事件是df $ type =“ ES”的行。 y事件是df $ type =“ PH”的第一次。

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

library(tidyverse)
# What I have 

df <- data.frame(
  type = c("ES", "OT", "ES", "PH", "ES", "PH", "OT", "ES"),
  bef_aft_PH = c(-3, -2, -1, 0, 1, 2, 3, 4),
  rownum_at_PH = c(4,4,4,4,4,4,4,4),
  date = as.POSIXct(c("2019/01/01", "2019/01/05", "2019/01/15", "2019/02/19", "2019/03/11", "2019/03/22", "2019/04/20", "2019/05/01"))
)

df
#>   type bef_aft_PH rownum_at_PH       date
#> 1   ES         -3            4 2019-01-01
#> 2   OT         -2            4 2019-01-05
#> 3   ES         -1            4 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            4 2019-05-01


# Non-elegant Solution
df %>% 
  mutate(EScumsum = cumsum(type == "ES"),
         ES_bef_aft_PH = case_when(
           bef_aft_PH < 0 ~ as.double(x = EScumsum - (EScumsum[match("PH", .$type)] + 1)), 
           bef_aft_PH == 0 ~ as.double(x = EScumsum - EScumsum),
           bef_aft_PH > 0 ~ as.double(x = EScumsum - EScumsum[match("PH", .$type)])
         ))
#>   type bef_aft_PH rownum_at_PH       date EScumsum 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        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            4 2019-05-01        4             2

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

1 个答案:

答案 0 :(得分:0)

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