我有一个项目的数据框,其中包含在不同时间发生的一定数量的不同事件。例如说我在各种足球比赛中都有过几次比赛(进球,角球,红牌等等)。我想计算每个游戏中每个团队在一定时间之前发生的每个事件的数量(每个游戏中的时间是不同的)。
因此,我可以有一个事件数据框(其中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场比赛,我想计算第45分钟之前每支球队的每项赛事的数量,对于第2场比赛,我想做同样的事情,但对于第60分钟,我想做的是,返回类似以下内容:
game_id time t1_C t1_G t1_R t2_C t2_G t2_R
1 45 2 0 0 1 0 0
2 65 2 0 0 2 1 0
由于在第1场比赛中,第1队在第45分钟之前有2个角,0个进球和0个红牌,而第2队有1个角,0个进球和0个红牌。
我一直通过使用apply来遍历和子集我要处理的数据并计算行数来完成此操作,但是我有1000的行数,这需要很多时间。
有谁知道最快的方法吗?
编辑:我没有提到任何event_id可能多次出现在eventTime数据帧中的时间不同。例如game_id可能出现两次,分别是时间45和70,我想为每个唯一的事件/时间组合获取适当的计数。
多亏了你们两个,我想您的两个答案都可以回答我的第一个问题,但对已编辑的问题却不太有用。但是,我结合了您的两个答案中的一部分,以获得对我有用的东西。
我使用了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")
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句