我正在努力完成看似简单的任务。我想知道在一场体育比赛中得分事件有多远。除了我自己的无知之外,复杂因素是我希望在我相当大的数据集中为每场比赛提供此信息。
以下是一些模拟我问题的可重现数据:
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库上有一个破解,我认为这可能会得到我的答案,但我似乎无法获得我正在寻找的输出。在每次记录得分事件之后,我希望能够生成一个新列,其中包含自该比赛中最后一个得分事件以来经过的时间。
答案 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