Для любой данной строки я хочу знать, сколько x-событий от этой строки происходит с первого раза, когда 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
Я не ожидал, что мне нужно будет обернуть все аргументы RHS case_when в as.double (), поэтому мне интересно узнать, зачем мне это тоже нужно сделать.