【问题标题】:Time Elapsed Since Last Event by Group自上次事件以来经过的时间(按组)
【发布时间】:2014-09-25 15:40:40
【问题描述】:

我正在尝试完成看似相当简单的任务。我想知道在一场体育比赛中得分事件之间的距离有多远。除了我自己的无知之外,复杂的因素是我希望在我相当大的数据集中的每场比赛中都获得这些信息。

这里有一些可重现的数据来模拟我的问题:

data.frame(
 matchid = sample(seq(from = 1, to = 10, by = 1), size = 1000, replace = TRUE), 
 scoreTime = as.POSIXlt(Sys.time() - 1:1000)
       ) -> df

如果我不关心每场比赛的这些信息,那么我知道我可以使用 diff 函数和如下代码:

diff(as.POSIXlt(df$scoreTime), 1)   

我对 plyr 库有所了解,我认为这可能是我的答案,但我似乎无法获得我正在寻找的输出。在每个记录的得分事件之后,我希望能够生成一个新列,其中包含自该比赛中最后一个得分事件以来经过的时间。

【问题讨论】:

    标签: r time grouping


    【解决方案1】:

    您可以使用dplyr 包做到这一点:

    library(dplyr)
    df %>% arrange(scoreTime) %>% group_by(matchid) %>%
           mutate(sinceLast = c(NA, diff(as.POSIXlt(scoreTime), 1)))
    

    这意味着:

    • arrange(scoreTime) 以增加时间排序(如果您要使用diff,则需要)
    • group_by(matchid) 根据匹配(您要查找的内容)分组
    • mutate(sinceLast = c(NA, diff(as.POSIXlt(scoreTime), 1))) 在每场比赛中,添加一个名为 sinceLast 的新列,用于描述自上次得分事件以来的时间量(以秒为单位)。请注意,我必须在开头添加 NA(因为对于游戏中的第一个得分事件, 不是“自上次得分以来的时间)。

    【讨论】:

    • 感谢您出色的代码和对其功能的出色解释。你有我最深切的感谢。
    【解决方案2】:

    使用基础 R:

    > sapply(unique(df$matchid), function(x) diff(as.POSIXlt(df[df$matchid==x,]$scoreTime), 1)   )
    [[1]]
    Time differences in secs
      [1] -23  -1  -6 -12  -1  -7 -20  -7  -1  -4  -7 -17  -1  -4  -1  -6  -5  -1  -1 -10 -11  -1  -4  -8  -1  -3  -2 -10 -13  -3 -15
     [32]  -1  -1  -1  -4 -14 -12  -1 -48  -1 -13  -7  -2  -3  -7 -38  -8  -1 -25 -13  -8  -1  -9 -10  -7  -1 -18 -24  -9  -7  -4  -9
     [63]  -1  -1  -9 -15  -1  -2 -24 -14  -2 -12  -1 -15  -4 -17 -20 -14 -17  -1 -14 -10  -7  -1  -3 -50 -51 -11  -2  -3  -1  -1  -8
     [94] -10  -7  -2  -3 -18  -3 -18  -3  -2 -15 -14  -1 -10 -16  -1 -10 -12
    attr(,"tzone")
    [1] ""
    
    [[2]]
    Time differences in secs
      [1]  -3 -16  -9  -6  -4 -13  -8 -19  -6 -10  -8 -12  -6 -13  -6 -14 -41  -5 -37  -4  -3  -2  -4  -4 -12  -2 -10 -20  -8  -7  -3
     [32] -13 -20  -1  -1  -9 -16  -4  -2 -15  -7  -5  -1 -10 -11 -13  -6 -17 -27 -12 -13  -4  -5  -6 -10  -5  -2  -8 -11 -17  -5  -6
     [63] -13 -33 -19  -5 -24  -2  -1 -16 -11  -6  -1 -22  -6  -9  -6 -10 -16  -6  -2  -1  -3 -10  -4  -4 -11  -1  -8 -27  -1  -6 -25
     [94]  -5  -2  -2 -30 -14 -17 -17  -5
    attr(,"tzone")
    [1] ""
    
    [[3]]
    ...
    

    【讨论】:

      【解决方案3】:

      我的做法与@David Robinson 基本相同。但是,我使用了lag() 而不是diff()。在这种情况下,lag() 为每个匹配中的第一个观察结果生成 NA。

      ana <- df %>%
              arrange(matchid, scoreTime) %>%
              group_by(matchid) %>%
              mutate(gap = scoreTime - lag(scoreTime))
      
      ana 
      
         matchid           scoreTime     gap
      1        1 2014-09-26 00:26:02 NA secs
      2        1 2014-09-26 00:26:04  2 secs
      3        1 2014-09-26 00:26:14 10 secs
      4        1 2014-09-26 00:26:19  5 secs
      5        1 2014-09-26 00:26:26  7 secs
      6        1 2014-09-26 00:26:28  2 secs
      7        1 2014-09-26 00:26:32  4 secs
      8        1 2014-09-26 00:26:36  4 secs
      9        1 2014-09-26 00:26:54 18 secs
      10       1 2014-09-26 00:27:13 19 secs
      

      【讨论】:

        猜你喜欢
        • 2014-12-20
        • 1970-01-01
        • 2015-12-19
        • 2018-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-06
        相关资源
        最近更新 更多