对于任何给定的行,我想知道从我的数据集中第一次发生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参数,因此我想知道为什么也需要这样做。
答案 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