如何计算连续足球比赛中球门出现次数之间的差异?

时间:2014-12-07 19:42:45

标签: r dplyr

我试图计算一支球队在连续足球比赛中进球的一系列时间 - 每场比赛持续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

2 个答案:

答案 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分钟加上自上次进球以来的时间。我不确定这是不是你想要的,但如果不是这样的话就应该相对简单。