【问题标题】:How to count observations between two rows based on condition in R?如何根据 R 中的条件计算两行之间的观察值?
【发布时间】:2021-07-16 18:54:48
【问题描述】:

我正在尝试为数据框创建一个变量,在该变量中我计算两个符合标准的观察之间的观察数量。这里是计算自上次赢得比赛以来的次数。

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

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 中的变量

【问题讨论】:

    标签: r dplyr counting


    【解决方案1】:

    我不太清楚为什么第一个值应该是 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])
    

    这不是很好,但它有效;)

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 2020-10-25
        • 1970-01-01
        • 1970-01-01
        • 2021-11-03
        • 2018-02-28
        • 1970-01-01
        相关资源
        最近更新 更多