我正在研究乒乓数据项目。我有一个大数据集,其中包括来自乒乓球比赛的每个发球的记录数据,其中一个变量表明谁赢了哪个点,一个变量表明谁开始了与发球的比赛 - 但是没有变量表明谁在为任何给定点服务。乒乓球的规则(或者至少是我们的内线规则)允许我推断出这个最终变量 - 发球器每五个发球器关闭一次,一旦玩家进入游戏点,另一个玩家接管发球,直到他们进入游戏点。以下面的比赛为例,其中没有人在20-20之前中断比赛,此时球员1赢得两个连续的比分以赢得比赛22-20(第一到21,赢2)。
WonServe <- "Player1"
Serve <- seq_len(42)
MatchNum <- rep(1, 42)
Player1Points <- c(1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1)
Player2Points <- c(0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0)
ServingPlayer <- c(1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,NA,NA)
df <- as.data.frame(cbind(Serve, Player1Points, Player2Points, ServingPlayer, MatchNum))
现在,我知道谁为前40名队员服务,但之后事情变得棘手。球员1最初在20-20发球,因为他最初赢得发球局(现在转回给他)。然而,一旦他以21-20领先,球员2接管发球。我希望在我的数据中对此规则进行建模,以找出谁为每个服务器服务过去服务器40.使用循环,这可能如下所示:
for(i in 41:length(df$ServingPlayer)) {
if(i == 41) {
if(WonServe == "Player1") {df$ServingPlayer <- 1} else if(WonServe == "Player2") {df$ServingPlayer <- 0}
} else if(i > 41) {
if(cumsum(df$Player1Points[i]) > cumsum(df$Player2Points[i])) {
df$ServingPlayer[i] <- 0
} else if(cumsum(df$Player1Points[i]) < cumsum(df$Player2Points[i])) {
df$ServingPlayer[i] <- 1
} else if(cumsum(df$Player1Points[i]) == cumsum(df$Player2Points[i])) {
df$ServingPlayer[i] <- df$ServingPlayer[i-1]
}
}
}
我的问题是我们有一个包含数百个游戏的巨大数据集(不要判断)。如果我在整个数据集中使用它,我(我想)必须在循环中创建一个循环,将此循环应用于数据集中的df$MatchNum
的每个值 - 这将变得非常慢。
答案 0 :(得分:0)
您可以制作比需要更长的服务指标向量,然后只提取所需的长度:
c(rep( rep(1:0, each=5), 4), rep(Player1Points[1]:Player2Points[1], times=20) )[ 1:length(Player1Points)]
#-------
[1] 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1
[33] 1 1 1 0 0 0 0 0 1 0