我试图计算一支球队在连续足球比赛中进球的一系列时间 - 每场比赛持续90分钟。这是一个系列开始的例子
df <- structure(list(game = c(1, 1, 2, 3), time = c(28, 39, NA, 52)), .Names = c("game",
"time"), row.names = c(NA, -4L), class = "data.frame")
所以在这个例子中,在第一场比赛中有两个进球,第二场比赛没有,第三场比赛一场。
输出应该是 28,11,203 ...
我很乐意使用dplyr或base R
TIA
答案 0 :(得分:2)
这是一个dplyr解决方案。
library("dplyr")
games <- data_frame(
game = c(1, 1, 2, 3),
time = c(28, 39, NA, 52)
)
games %>%
filter(!is.na(time)) %>%
mutate(
game_start = (game - 1) * 90,
goal_time = game_start + time,
diff = goal_time - lag(goal_time, default = 0)
)
答案 1 :(得分:1)
这是解决问题的快速而肮脏的解决方案,但我确信有更高效,更优雅的替代解决方案:
time.series <- numeric(0)
j <- 1
if(!is.na(df$time[1]))
{
time.series[j] <- df$time[1]
j <- j + 1
} else
time.series[j] <- 90
for(i in 2:nrow(df))
{
if(df$game[i-1]==df$game[i])
{
time.series[j] <- df$time[i] - df$time[i-1]
j <- j + 1
}
else
{
if(!is.na(df$time[i-1]))
{
if(is.na(df$time[i]))
{
time.series[j] <- (90 - df$time[i-1]) + 90
}
else
{
time.series[j] <- (90 - df$time[i-1]) + df$time[i]
j <- j + 1
}
}
else
{
if(is.na(df$time[i]))
time.series[j] <- time.series[j] + 90
else
{
time.series[j] <- time.series[j] + df$time[i]
j <- j + 1
}
}
}
}
在示例中使用此代码会创建带有预期输出的向量time.series
:
time.series
[1] 28 11 193
请注意,在您的示例中,最后一个条目应为193,因为((90-39)+ 90 + 52)= 193。
此外,如果上一场比赛中没有进球,time.series
的最后一项将是上一场比赛的90分钟加上自上次进球以来的时间。我不确定这是不是你想要的,但如果不是这样的话就应该相对简单。