2017-12-06 16 views
0

Ich habe einen Datensatz mit eindeutigen Übereinstimmungen wie diesem. Jede Zeile ist eine Übereinstimmung mit dem Ergebnis.Übereinstimmende Zeilen innerhalb desselben Datensatzes in R

date <- c('2017/12/01','2017/11/01','2017/10/01','2017/09/01','2017/08/01','2017/07/01','2017/06/01') 
team1 <- c('A','B','B','C','D','A','B') 
team1_score <- c(1,0,4,3,5,6,7) 
team2 <- c('B','A','A','B','C','C','A') 
team2_score <- c(0,1,5,4,6,9,10) 
matches <- data.frame(date, team1, team1_score, team2, team2_score) 

Ich möchte zwei neue Spalten erstellen, Formulare für Team 1 und Team 2 Das Ergebnis des Spiels kann durch die Mannschaft bestimmt werden eine größere Punktzahl oder ein Unentschieden. Das Ergebnis würde ungefähr wie folgt aussehen. Die Form wäre also das Ergebnis von team1 in den letzten 2 Spielen. Zum Beispiel, für die ersten 3 Zeilen, Form von Team 1 und 2 sind jeweils. Es wird Zeiten geben, in denen es nicht genug 2 Matches eines bestimmten Teams gibt, daher ist ein NULL-Ergebnis ausreichend. Ich möchte die Form von team1 und team2 wissen, die in ein Match gehen.

  • Form1: W-W, L-W, W-L
  • Form2: L-L, W-L, L-W

In der aktuellen Datensatz gibt es viel mehr als nur 4 einzigartige Teams. Ich habe nachgedacht, kann mir aber keine gute Möglichkeit vorstellen, diese 2 Variablen zu erstellen.

+2

Wie wissen Sie über ein Ergebnis? Übertrifft eine Note von "B" eine Punktzahl von 1? – Gregor

+1

Bitte geben Sie ein reproduzierbares Beispiel an. Suchen Sie nach der Funktion dput(), um einen reproduzierbaren Datensatz bereitzustellen. Sie haben viele Möglichkeiten. Wenn die Daten in einem langen (d. H. "Ordentlich") Format vorliegen, könnten Sie eine rollende Summe von Siegen und Niederlagen haben, die ein Ergebnis in einem Format wie W | L oder gemäß Ihren Beispielen 3 | 2 ergeben würde. Sie könnten auch eine if_else -Funktion haben, die eine Buchstabenfolge erstellt, die mathematische Ergebnisse gegen die letzten fünf Iterationen dreht, und dann diese Zeichenfolgen verkettet. –

+0

@Gregor: Ja, die Mannschaft kann in Team1 oder Team2 sein, wenn sie eine größere Punktzahl haben, heißt das, dass sie gewinnen. –

Antwort

0

Hier ist meine Lösung:

library(tidyverse) 


    date <- as.Date(c('2017/12/01','2017/11/01','2017/10/01','2017/09/01','2017/08/01','2017/07/01','2017/06/01', '2017/05/30')) 
    team1 <- c('A','B','B','C','D','A','B','A') 
    team1_score <- c(1,0,4,3,5,6,7,0) 
    team2 <- c('B','A','A','B','C','C','A','D') 
    team2_score <- c(0,1,5,4,6,9,10,0) 
    matches <- data.frame(date, team1, team1_score, team2, team2_score) 

    ## 1. Create a unique identifier for each match. It assumes that teams can only play each other once a day. 
    matches$UID <- paste(matches$date, matches$team1, matches$team2, sep = "-") 

    ## 2. Create a Score Difference Varaible reflecting team1's score 
    matches <- matches %>% mutate(score_dif_team1 = team1_score - team2_score) 

    ## 3. Create a Result (WDL) reflecting team1's results 
    matches <- matches %>% mutate(results_team1 = if_else(score_dif_team1 < 0, true = "L", false = if_else(score_dif_team1 > 0, true = "W", false = "D"))) 

    ## 4. Cosmetic step: Reorder variables for easier comparison across variables 
    matches <- matches %>% select(UID, date:results_team1) 

    ## 5. Reshape the table into a long format based on the teams. Each observation will now reflect the results of 1 team within a match. Each game will have two observations. 
    matches <- matches %>% gather(key = old_team_var, value = team, team1, team2) 

    ## 6. Stablishes a common results variable for each observation. It essentially inverts the results_team1 varaible for teams2, and keeps results_team1 identical for teams1 
    matches <- matches %>% 
       mutate(results = if_else(old_team_var == "team2", 
                true = if_else(results_team1 == "W", 
                    true = "L", 
                    false = if_else(results_team1 == "L", 
                        true = "W", 
                        false = "D")), 
                false = results_team1)) 

## Final step: Filter the matches table by the dates you are interested into, and then reshapes the table to show a data frame of DLW in long format. 

    Results_table <- matches %>% filter(date <= as.Date("2017-12-01")) %>% group_by(team, results) %>% summarise(cases = n()) %>% spread(key = results, value = cases, fill = 0) 

## Results: 
    # A tibble: 4 x 4 
    # Groups: team [4] 
     team  D  L  W 
    * <chr> <dbl> <dbl> <dbl> 
    1  A  1  1  4 
    2  B  0  4  1 
    3  C  0  1  2 
    4  D  1  1  0 
Verwandte Themen