自上次事件以来经过的时间

时间:2014-09-25 15:40:40

标签: r time grouping

我正在努力完成看似简单的任务。我想知道在一场体育比赛中得分事件有多远。除了我自己的无知之外,复杂因素是我希望在我相当大的数据集中为每场比赛提供此信息。

以下是一些模拟我问题的可重现数据:

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库上有一个破解,我认为这可能会得到我的答案,但我似乎无法获得我正在寻找的输出。在每次记录得分事件之后,我希望能够生成一个新列,其中包含自该比赛中最后一个得分事件以来经过的时间。

3 个答案:

答案 0 :(得分: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(因为对于游戏中的第一个得分事件, 不是“自上次得分以来的时间)。

答案 1 :(得分:1)

使用基数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]]
...

答案 2 :(得分:0)

我的方法与@ 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
相关问题