Как создать полосу (или прогон формы) в R на основе даты, команды и соревнования? - PullRequest
1 голос
/ 19 февраля 2020

У меня довольно специфическая c проблема. Я думаю, что я изо всех сил пытался ответить, и думал, что открою ее замечательному сообществу.

У меня есть набор данных, показанный ниже (это подмножества из более чем 30 000 строк - поэтому мы хотим сделать это решение максимально воспроизводимым):

*Date,Home Team,Away Team,League,Home Goals,Away Goals
43389,Everton,Wolves,League,1,3
43364,Man C,Arsenal,League,3,1
43414,Everton,Man C,League,0,2
43385,Liverpool,Bournemouth,League,3,0
43397,Man C,Chelsea,League,6,0
43390,Liverpool,Watford,League,5,0
43381,Man C,West Ham,League,1,0
43392,Man C,Arsenal,League,3,1
43369,Everton,Man C,League,0,2
43375,Liverpool,Bournemouth,League,3,0
43382,Man C,Chelsea,League,6,0
43396,Liverpool,Watford,League,5,0
43373,Man C,West Ham,League,1,0*

В R то, что я хотел бы добавить к каждой из строк, - это полоса, чтобы сказать, как во многих играх каждая команда выиграла подряд (в рамках каждого соревнования) в зависимости от даты, т.е. сколько игр выиграли подряд в хронологическом порядке? В идеале их должно быть четыре колонки -> полоса хозяев дома в гостях, полоса гостей в гостях, общая полоса хозяев дома (хозяева и гости вместе) и полоса хозяев дома (дома и гости вместе). Хотя я уверен, что после того, как одно решение будет найдено, другие смогут воссоздать с использованием аналогичного кода. Я чувствую, что мог бы сделать это в Excel с помощью Count или Sumif, однако я не уверен, как воспроизвести это в R, и хотел бы, чтобы это было как можно более эффективным.

Заранее спасибо за вашу помощь !!

> dput(Data)
structure(list(Date = structure(c(3L, 10L, 12L, 2L, 7L, 13L, 
4L, 8L, 9L, 4L, 11L, 1L, 5L, 6L), .Label = c("03/10/2018", "04/10/2018", 
"04/11/2018", "09/10/2018", "10/11/2018", "13/09/2018", "16/09/2018", 
"16/10/2018", "20/09/2018", "21/10/2018", "22/10/2018", "28/09/2018", 
"30/09/2018"), class = "factor"), Home.Team = structure(c(1L, 
3L, 1L, 2L, 3L, 2L, 3L, 1L, 3L, 1L, 2L, 3L, 2L, 3L), .Label = c("Everton", 
"Liverpool", "Man C"), class = "factor"), Away.Team = structure(c(7L, 
1L, 4L, 2L, 3L, 5L, 6L, 7L, 1L, 4L, 2L, 3L, 5L, 6L), .Label = c("Arsenal", 
"Bournemouth", "Chelsea", "Man C", "Watford", "West Ham", "Wolves"
), class = "factor"), Competition = structure(c(2L, 2L, 2L, 2L, 
2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 2L), .Label = c("Cup", "League"
), class = "factor"), Home.Goals = c(1L, 3L, 0L, 3L, 6L, 5L, 
1L, 1L, 3L, 0L, 3L, 6L, 5L, 1L), Away.Goals = c(3L, 1L, 2L, 0L, 
0L, 0L, 0L, 3L, 1L, 2L, 0L, 0L, 0L, 0L)), .Names = c("Date", 
"Home.Team", "Away.Team", "Competition", "Home.Goals", "Away.Goals"
), class = "data.frame", row.names = c(NA, -14L))

1 Ответ

1 голос
/ 19 февраля 2020

Я надеюсь, что поможет следующее. В выборке данных есть только команды, которые всегда выигрывают или всегда проигрывают, но запуск всего этого набора данных также должен работать.

library(dplyr)
library(data.table)

df <- df %>%
    mutate_if(is.factor, as.character) # turn factors into characters

#          Date Home.Team   Away.Team Competition Home.Goals Away.Goals
# 1  04/11/2018   Everton      Wolves      League          1          3
# 2  21/10/2018     Man C     Arsenal      League          3          1
# 3  28/09/2018   Everton       Man C      League          0          2
# 4  04/10/2018 Liverpool Bournemouth      League          3          0
# 5  16/09/2018     Man C     Chelsea      League          6          0
# 6  30/09/2018 Liverpool     Watford      League          5          0
# 7  09/10/2018     Man C    West Ham         Cup          1          0
# 8  16/10/2018   Everton      Wolves         Cup          1          3
# 9  20/09/2018     Man C     Arsenal      League          3          1
# 10 09/10/2018   Everton       Man C      League          0          2
# 11 22/10/2018 Liverpool Bournemouth      League          3          0
# 12 03/10/2018     Man C     Chelsea         Cup          6          0
# 13 10/11/2018 Liverpool     Watford      League          5          0
# 14 13/09/2018     Man C    West Ham      League          1          0

# now we stack the dataframe twice on top of each other...
df <- df %>% # first...
    rename(Home.Team = Away.Team # ...with switched home and away columns
           , Away.Team = Home.Team
           , Home.Goals = Away.Goals
           , Away.Goals = Home.Goals) %>%
    bind_rows(df) # and second in the original form

#          Date   Away.Team   Home.Team Competition Away.Goals Home.Goals
# 1  04/11/2018     Everton      Wolves      League          1          3
# 2  21/10/2018       Man C     Arsenal      League          3          1
# 3  28/09/2018     Everton       Man C      League          0          2
# 4  04/10/2018   Liverpool Bournemouth      League          3          0
# 5  16/09/2018       Man C     Chelsea      League          6          0
# 6  30/09/2018   Liverpool     Watford      League          5          0
# 7  09/10/2018       Man C    West Ham         Cup          1          0
# 8  16/10/2018     Everton      Wolves         Cup          1          3
# 9  20/09/2018       Man C     Arsenal      League          3          1
# 10 09/10/2018     Everton       Man C      League          0          2
# 11 22/10/2018   Liverpool Bournemouth      League          3          0
# 12 03/10/2018       Man C     Chelsea         Cup          6          0
# 13 10/11/2018   Liverpool     Watford      League          5          0
# 14 13/09/2018       Man C    West Ham      League          1          0
# 15 04/11/2018      Wolves     Everton      League          3          1
# 16 21/10/2018     Arsenal       Man C      League          1          3
# 17 28/09/2018       Man C     Everton      League          2          0
# 18 04/10/2018 Bournemouth   Liverpool      League          0          3
# 19 16/09/2018     Chelsea       Man C      League          0          6
# 20 30/09/2018     Watford   Liverpool      League          0          5
# 21 09/10/2018    West Ham       Man C         Cup          0          1
# 22 16/10/2018      Wolves     Everton         Cup          3          1
# 23 20/09/2018     Arsenal       Man C      League          1          3
# 24 09/10/2018       Man C     Everton      League          2          0
# 25 22/10/2018 Bournemouth   Liverpool      League          0          3
# 26 03/10/2018     Chelsea       Man C         Cup          0          6
# 27 10/11/2018     Watford   Liverpool      League          0          5
# 28 13/09/2018    West Ham       Man C      League          0          1

df %>%
    mutate(won = Home.Goals < Away.Goals) %>% # now we calculate whether the match was won
    arrange(Home.Team, Date) %>% # sort by home.team and then date
    group_by(Home.Team) %>% # and for every home.team...
    mutate(streakGroup = rleid(won)) %>% # ...we calculate an ID for all the streaks
    group_by(Home.Team, streakGroup) %>% # and then for every home.team AND streak
    mutate(gamesWonInStreak = cumsum(won)) # we calculate the cumulative sum (number of games won in a roll)

#    Date       Away.Team Home.Team   Competition Away.Goals Home.Goals won   streakGroup gamesWonInStreak
#    <chr>      <chr>     <chr>       <chr>            <int>      <int> <lgl>       <int>            <int>
# 1  20/09/2018 Man C     Arsenal     League               3          1 TRUE            1                1
# 2  21/10/2018 Man C     Arsenal     League               3          1 TRUE            1                2
# 3  04/10/2018 Liverpool Bournemouth League               3          0 TRUE            1                1
# 4  22/10/2018 Liverpool Bournemouth League               3          0 TRUE            1                2
# 5  03/10/2018 Man C     Chelsea     Cup                  6          0 TRUE            1                1
# 6  16/09/2018 Man C     Chelsea     League               6          0 TRUE            1                2
# 7  04/11/2018 Wolves    Everton     League               3          1 TRUE            1                1
# 8  09/10/2018 Man C     Everton     League               2          0 TRUE            1                2
# 9  16/10/2018 Wolves    Everton     Cup                  3          1 TRUE            1                3
# 10 28/09/2018 Man C     Everton     League               2          0 TRUE            1                4
# # ... with 18 more rows
...