根据其他列中的条件减去行

Mat*_*att 3 r dplyr

我正在使用与此类似的数据框:

df1 <- data.frame(p1 = c("John", "John", "John", "John", "John", "John", "Jim", "Jim", "Jim", "Jim", "Jim", "Jim", "Jim","Jim" ),
           elapsed_time = c(0, 4, 6, 9, 12, 14, 17, 22, 27, 35, 42, 47, 51, 57),
           event_type = c("start of period", "play", "play", "play", "play", "play", "play", "play", "play", "timeout", "play", "play", "play", "play"))
Run Code Online (Sandbox Code Playgroud)

看起来像这样:

 p1 elapsed_time      event_type
1  John            0 start of period
2  John            4            play
3  John            6            play
4  John            9            play
5  John           12            play
6  John           14            play
7   Jim           17            play
8   Jim           22            play
9   Jim           27            play
10  Jim           35         timeout
11  Jim           42            play
12  Jim           47            play
13  Jim           51            play
14  Jim           57            play
Run Code Online (Sandbox Code Playgroud)

我想做的是添加第四列,用于计算自发生三件事之一以来经过的时间:1)event_type ==“周期开始”2)eventtype ==“超时”3)p1已更改(如行中所示) 7 从约翰到吉姆)。这三件事中的任何一个都应该将第四列重置为零。

我想要的输出是

 p1 elapsed_time      event_type    elapsed_time_since_last_break
1  John            0 start of period                             0
2  John            4            play                             4
3  John            6            play                             6
4  John            9            play                             9
5  John           12            play                            12
6  John           14            play                            14
7   Jim           17            play                             0
8   Jim           22            play                             5
9   Jim           27            play                            10
10  Jim           35         timeout                             0
11  Jim           42            play                             7
12  Jim           47            play                            12
13  Jim           51            play                            16
14  Jim           57            play                            22
Run Code Online (Sandbox Code Playgroud)

我对 r 有点陌生,还没有取得太大的成功。我确信可能有一个我忽略的简单解决方案。

Ony*_*mbu 7

df1 %>%\n  group_by(p1, elps = cumsum(event_type != 'play'))%>%\n  mutate(elps = elapsed_time - elapsed_time[1])\n\n# A tibble: 14 \xc3\x97 4\n# Groups:   p1, elps [13]\n   p1    elapsed_time event_type       elps\n   <chr>        <dbl> <chr>           <dbl>\n 1 John             0 start of period     0\n 2 John             4 play                4\n 3 John             6 play                6\n 4 John             9 play                9\n 5 John            12 play               12\n 6 John            14 play               14\n 7 Jim             17 play                0\n 8 Jim             22 play                5\n 9 Jim             27 play               10\n10 Jim             35 timeout             0\n11 Jim             42 play                7\n12 Jim             47 play               12\n13 Jim             51 play               16\n14 Jim             57 play               22\n
Run Code Online (Sandbox Code Playgroud)\n