Возможно, существует более простой взлом, но вы можете попробовать:
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
иногда?).
Если это не просто опечатка, дайте нам знать, я адаптирую код.