Отслеживание формы в спорте с R? - PullRequest
0 голосов
/ 16 февраля 2019

Чтобы не отставать от текущей формы команд, я хочу знать, как они выступали в последних N-матчах.Данные начинаются следующим образом:

HomeTeam   AwayTeam  Winner 

Liverpool  Chelsea   Home
Arsenal    Liverpool Away
Manchester Liverpool TBA

Скажем, например, что я хочу знать форму последних 2 матчей перед началом 3-го матча, итоговый кадр данных должен выглядеть следующим образом:

HomeTeam   AwayTeam  Winner HomeForm AwayForm

LiverPool  Chelsea   Home   NA       NA
Arsenal    Liverpool Away   0        1
Manchester Liverpool TBA    0        2

Я рассмотрел функции LAG и IF / ELSE, но не могу найти решения, которое бы динамически просматривало результаты.

1 Ответ

0 голосов
/ 17 февраля 2019

Возможно, существует более простой взлом, но вы можете попробовать:

library(tidyverse)
library(zoo)

last_n_games <- 2

df <- df %>% rowid_to_column

Forms <- df %>%
  mutate(Winner = case_when(Winner == "Home" ~ HomeTeam, 
                            Winner == "Away" ~ AwayTeam,
                            TRUE ~ "TBA")
  ) %>% 
  gather(Team, name, HomeTeam:AwayTeam) %>%
  distinct(rowid, name, Winner) %>%
  group_by(name) %>%
  arrange(rowid) %>%
  mutate(
    HomeForm = +(Winner == name),
    HomeForm = rollapply(HomeForm, width = list(-(1:last_n_games)), sum, 
                              partial = TRUE, fill = NA, align = "right"),
    AwayForm = HomeForm
  ) %>%
  mutate_at(vars(contains("Form")), funs(ifelse(rowid != 1 & is.na(.), 0, .))) %>%
  distinct(rowid, name, HomeForm, AwayForm)

df %>%
  left_join(Forms %>% select(-AwayForm), by = c("rowid", "HomeTeam" = "name")) %>%
  left_join(Forms %>% select(-HomeForm), by = c("rowid", "AwayTeam" = "name")) %>%
  select(-rowid)

Вывод:

    HomeTeam  AwayTeam Winner HomeForm AwayForm
1  Liverpool   Chelsea   Home       NA       NA
2    Arsenal Liverpool   Away        0        1
3 Manchester Liverpool    TBA        0        2

О, и я забыл - это предполагает, что ваш фрейм данных не имееторфографические ошибки (действительно ли у вас Liverpool как LiverPool иногда?).

Если это не просто опечатка, дайте нам знать, я адаптирую код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...