如何根据 R 中的条件计算两行之间的观察值?

How to count observations between two rows based on condition in R?

我正在尝试为数据框创建一个变量,我在其中计算两个符合条件的观察值之间的观察值数量。这里是统计自上次比赛获胜后的次数。

假设我有这样一个数据框:

df <- data.frame(player = c(10,10,10,10,10,10,10,10,10,10,10),win = c(1,0,0,0,1,1,0,1,0,0,1))

我想创建一个新变量来计算玩家获胜后的游戏次数。 总结在一个向量中,结果应该是(为第一次观察设置一个不适用):

c(NA,0,1,2,3,0,0,1,0,1,2)

我希望能够轻松地做到这一点,并使用 dplyr(或任何其他合适的方法)将其创建为 data.frame 中的变量

我不太清楚为什么第一个值应该是 NA。因为自上次“获胜”以来经过的时间为 0 而不是 NA。

出于纯粹的逻辑原因,我将采用以下方法:

seq = with(df, ave(win, cumsum(win == 1), FUN = seq_along)-1)

所以你得到自上次获胜以来的过去累积总和游戏如下:

c(0,1,2,3,0,0,1,0,1,2,0)

但是,如果您仍然希望通过少量数据处理来达到所描述的结果,则可以通过以下方式实现:

append(NA, seq[1:length(seq)-1])

它不是很好,但它很管用 ;)

With {tidyverse}, try:

library(tidyverse)

df <- data.frame(player = c(10,10,10,10,10,10,10,10,10,10,10),
                 win = c(1,0,0,0,1,1,0,1,0,0,1))

df %>% 
  group_by(player, group = cumsum(win != lag(win, default = first(win)))) %>%
  mutate(counter = row_number(),
         counter = if_else(win == 1, true = 0L, false = counter)) %>% 
  ungroup() %>% 
  group_by(player) %>% 
  mutate(counter = if_else(row_number() == 1, true = NA_integer_, false = counter)) %>% 
  ungroup() %>% 
  select(-group)

  player   win counter
    <dbl> <dbl>   <int>
 1     10     1      NA
 2     10     0       1
 3     10     0       2
 4     10     0       3
 5     10     1       0
 6     10     1       0
 7     10     0       1
 8     10     1       0
 9     10     0       1
10     10     0       2
11     10     1       0