对R中一系列项目在特定时间之前的事件进行计数

对R中一系列项目在特定时间之前的事件进行计数,r,events,time,count,dataframe,R,Events,Time,Count,Dataframe,我有一个数据框,其中包含在不同时间发生的一定数量的不同事件。e、 g.假设我在各种足球比赛中有过多次事件(进球、角球、红牌等)。我想计算每场比赛中每个队在特定时间之前发生的每个事件的数量(每场比赛的时间不同) 所以我可以有一个事件的数据框架(其中C是角,G是目标,R是红牌),如下所示: events <- data.frame( game_id = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,

我有一个数据框,其中包含在不同时间发生的一定数量的不同事件。e、 g.假设我在各种足球比赛中有过多次事件(进球、角球、红牌等)。我想计算每场比赛中每个队在特定时间之前发生的每个事件的数量(每场比赛的时间不同)

所以我可以有一个事件的数据框架(其中C是角,G是目标,R是红牌),如下所示:

events <- data.frame(
            game_id = c(1,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,   2,   2),
            team    = c(1,   1,   2,   1,   2,   2,   1,   1,   2,   2,   2,   1,   1),
            event_id= c('C', 'C', 'C', 'G', 'C', 'R', 'C', 'C', 'C', 'C', 'G', 'G', 'C'),
            time    = c(5,   14,   27,  67,  78,  87, 10,  19,  33,  45,  60,  78,  89))
eventTime <- data.frame(
             game_id = c(1, 2),
             time    = c(45, 65))
因为在第1场比赛中,第1队在第45分钟前有2个角球、0个进球和0张红牌,而第2队有1个角球、0个进球和0张红牌

我一直在使用apply来遍历和子集我要查找的数据并计算行数,但是我有1000行,这需要很多时间

有人知道最快的方法吗


编辑:我没有提到任何游戏id可能会在eventTime数据框中出现多次,时间不同。例如,游戏id可能出现两次,时间分别为45和70,我希望获得每个独特事件/时间组合的适当计数。

一步一步地运行此步骤以了解,我认为这应该会给出预期的结果。此外,如果你愿意的话,还有减少代码的空间-

library(data.table)
library(reshape)
library(reshape2)

events <- data.table(events)
eventTime <- data.table(eventTime)
eventTime[,TimeLimit := time]

setkeyv(eventTime,c('game_id','time'))
setkeyv(events,c('game_id','time'))

eventsSubset <- eventTime[events, roll = -Inf][!is.na(TimeLimit)]

eventsSubset <- eventsSubset[,list(Freq = .N), by = c('team','event_id','game_id','TimeLimit')]

eventsReshaped <- cast(eventsSubset, game_id + TimeLimit ~ event_id+team, fun.aggregate = sum, value = "Freq")

PS-这假设在整个数据集中,每种类型的事件至少会发生一次。此特定代码的输出仅对找到的事件进行聚合,这就是为什么结果不包含所有事件团队组合的原因。如果您想确保不会发生这种情况,可以将虚拟条目添加到原始数据集中。

一步一步地运行此步骤以了解,我认为这将为您提供预期的结果。此外,如果你愿意的话,还有减少代码的空间-

library(data.table)
library(reshape)
library(reshape2)

events <- data.table(events)
eventTime <- data.table(eventTime)
eventTime[,TimeLimit := time]

setkeyv(eventTime,c('game_id','time'))
setkeyv(events,c('game_id','time'))

eventsSubset <- eventTime[events, roll = -Inf][!is.na(TimeLimit)]

eventsSubset <- eventsSubset[,list(Freq = .N), by = c('team','event_id','game_id','TimeLimit')]

eventsReshaped <- cast(eventsSubset, game_id + TimeLimit ~ event_id+team, fun.aggregate = sum, value = "Freq")

PS-这假设在整个数据集中,每种类型的事件至少会发生一次。此特定代码的输出仅对找到的事件进行聚合,这就是为什么结果不包含所有事件团队组合的原因。如果要确保不会发生这种情况,可以向原始数据集中添加虚拟条目。

将事件时间重命名为与“时间”不同的名称将有助于:

要在停止时间之前保留事件的子集:

e2 <- subset(events,time<stopTime)

这将有助于将事件时间重命名为与“时间”不同的名称:

要在停止时间之前保留事件的子集:

e2 <- subset(events,time<stopTime)

多亏了你们两位,我想你们的两个答案都能回答我最初的问题,但对编辑后的问题不太管用。然而,我结合了你们两个答案的部分,得到了一些对我有用的东西

我使用了Ben Bolkers答案的第一部分,通过合并数据帧和时间小于stopTime的子集。然后转换到数据表并使用Coderemifa答案的最后两行。所以有如下几点

library(reshape)
library(reshape2)
library(plyr)
names(eventTime)[2] <- "stopTime"
events <- merge(events,eventTime)
e2 <- subset(events,time<stopTime)
eventsSubset <- data.table(e2)
eventsSubset <- eventsSubset[,list(Freq = .N), by=c('team','event_id','game_id','stopTime')]
eventsReshaped <- cast(eventsSubset, game_id + stopTime~ event_id+team, fun.aggregate = sum, value = "Freq")
库(重塑)
图书馆(E2)
图书馆(plyr)

name(eventTime)[2]多亏了你们两位,我想你们的两个答案都可以回答我最初的问题,但对于编辑过的问题不太合适。然而,我结合了你们两个答案的部分,得到了一些对我有用的东西

我使用了Ben Bolkers答案的第一部分,通过合并数据帧和时间小于stopTime的子集。然后转换到数据表并使用Coderemifa答案的最后两行。所以有如下几点

library(reshape)
library(reshape2)
library(plyr)
names(eventTime)[2] <- "stopTime"
events <- merge(events,eventTime)
e2 <- subset(events,time<stopTime)
eventsSubset <- data.table(e2)
eventsSubset <- eventsSubset[,list(Freq = .N), by=c('team','event_id','game_id','stopTime')]
eventsReshaped <- cast(eventsSubset, game_id + stopTime~ event_id+team, fun.aggregate = sum, value = "Freq")
库(重塑)
图书馆(E2)
图书馆(plyr)

name(eventTime)[2]谢谢,我想这是我问的问题,但是我在最初的问题中没有提到其他一些东西(对不起,我的错,现在将编辑问题)。有一些游戏id在eventTime中多次出现,例如,我可以有两次游戏id,一次时间=45,一次时间=70,并且对于每个事件/时间组合,我希望获得计数。我不认为上面的这些会起作用?不。第一个想法-循环每一行eventstime并不断将输出发送到主数据集。谢谢,我认为这符合我的要求,但是我在最初的问题中没有提到其他内容(对不起,我的错误,现在将编辑问题)。有一些游戏id在eventTime中多次出现,例如,我可以有两次游戏id,一次时间=45,一次时间=70,并且对于每个事件/时间组合,我希望获得计数。我不认为上面的这些会起作用?不。第一个想法-循环遍历每一行eventstime,并将输出不断发送到主数据集。
e2 <- subset(events,time<stopTime)
m2 <- melt(with(e2,table(game_id,team,event_id)))
m3 <- dcast(m2,game_id~team+event_id)
merge(eventTime,m3)
library(reshape)
library(reshape2)
library(plyr)
names(eventTime)[2] <- "stopTime"
events <- merge(events,eventTime)
e2 <- subset(events,time<stopTime)
eventsSubset <- data.table(e2)
eventsSubset <- eventsSubset[,list(Freq = .N), by=c('team','event_id','game_id','stopTime')]
eventsReshaped <- cast(eventsSubset, game_id + stopTime~ event_id+team, fun.aggregate = sum, value = "Freq")