2017-08-31 2 views
0

Verzögerung Ich arbeite an meinen Fähigkeiten in R. Ich würde gerne dieses Problem mit dem dplyr-Paket, wenn möglich zu lösen.Berechnung der Gruppe Durchschnitt, dann auf Basis der Gruppe

Ich habe einen Datensatz von Fantasy Football Statistiken. Jeder Datensatz ist die Statistik eines Spielers für ein Spiel (Woche) einer Saison, einschließlich der Fantasy-Football-Punkte, die dieser Spieler in dieser Woche wert war.

Hier ist ein Ausschnitt aus den Daten mit Ich arbeite:

  Player Week year Fantasy.Points Avg.Fantasy.Ponts 
1 Aaron Hernandez  1 2011   16.3   9.678571 
2 Aaron Hernandez  2 2011   12.2   9.678571 
3 Aaron Hernandez  5 2011   5.6   9.678571 
4 Aaron Hernandez  6 2011   10.8   9.678571 
5 Aaron Hernandez  8 2011   7.1   9.678571 
6 Aaron Hernandez  9 2011   9.5   9.678571 
7 Aaron Hernandez 10 2011   4.1   9.678571 
8 Aaron Hernandez 11 2011   4.4   9.678571 
9 Aaron Hernandez 12 2011   6.2   9.678571 
10 Aaron Hernandez 13 2011   4.3   9.678571 
11 Aaron Hernandez 14 2011   8.4   9.678571 
12 Aaron Hernandez 15 2011   20.5   9.678571 
13 Aaron Hernandez 16 2011   3.7   9.678571 
14 Aaron Hernandez 17 2011   22.4   9.678571 
15 Aaron Hernandez  1 2012   12.4   8.755556 
16 Aaron Hernandez  6 2012   9.0   8.755556 
17 Aaron Hernandez  7 2012   5.4   8.755556 
18 Aaron Hernandez 12 2012   3.6   8.755556 
19 Aaron Hernandez 13 2012   9.7   8.755556 
20 Aaron Hernandez 14 2012   17.8   8.755556 

Das Feld Avg.Fantasy.Points ist die durchschnittliche Anzahl der Punkte, die Spieler über das Jahr in dieser Aufzeichnung wert waren. Zum Beispiel war Aaron Hernandez einen Durchschnitt von 9.678571 Punkten über die Saison 2011 und 8.75555 Punkte über die Saison 2012.

Ich bin daran interessiert, eine Spalte für die durchschnittliche Anzahl der Punkte zu berechnen, die ein Spieler im Vorjahr wert war. Im obigen Beispiel sollte ein Rekord für Aaron Hernandez im Jahr 2012 zeigen, dass das Vorjahr einen Durchschnitt von 9.68571 Punkten hatte.

Antwort

1

Ich fand eine Problemumgehungslösung, ähnlich einer Unterabfrage in SQL.

Sagen df_te der Datenrahmen aus dem Snippet oben ist:

df_te %>% 
    left_join(
     mutate(next.year = year + 1) %>% #add a column for the next year 
     group_by(Player, year) %>% 
     mutate(Previous.Avg.Fantasy.Points = first(Avg.Fantasy.Points) %>% #Copy of 'Avg.Fantasy.Points' column, with the name I'd like to have for new column 
     filter(row_number() == 1) %>% #Only keep one row per player/year group to avoid duplication upon join 
     select(Player, next.year, Previous.Avg.Fantasy.Points) #keep only columns I'd like to join in 
    by = c("Player" = "Player", "year" = "next.year") #By joining 'year' on LHS table with 'next.year' on RHS table, can get the previous year's average points.  
) 
0

Da Sie das dplyr Paket verwenden, ich habe die Verwendung von lag Funktion einführen will. Es kann die Werte für eine bestimmte Anzahl von Zeilen verschieben. Der Standardwert ist 1. Die letzte Zeile select(c(colnames(dt), "Pre.Avg.Fantasy.Ponts")) dient nur zum Anpassen der Reihenfolge der Spalten. dt2 ist die endgültige Ausgabe.

library(dplyr) 

dt2 <- dt %>% 
    group_by(Player, year) %>% 
    summarise(Avg.Fantasy.Ponts = first(Avg.Fantasy.Ponts)) %>% 
    mutate(Pre.Avg.Fantasy.Ponts = lag(Avg.Fantasy.Ponts)) %>% 
    select(-Avg.Fantasy.Ponts) %>% 
    right_join(dt, by = c("Player", "year")) %>% 
    select(c(colnames(dt), "Pre.Avg.Fantasy.Ponts")) 

Daten

dt <- read.table(text = "   Player Week year Fantasy.Points Avg.Fantasy.Ponts 
1 'Aaron Hernandez'  1 2011   16.3   9.678571 
       2 'Aaron Hernandez'  2 2011   12.2   9.678571 
       3 'Aaron Hernandez'  5 2011   5.6   9.678571 
       4 'Aaron Hernandez'  6 2011   10.8   9.678571 
       5 'Aaron Hernandez'  8 2011   7.1   9.678571 
       6 'Aaron Hernandez'  9 2011   9.5   9.678571 
       7 'Aaron Hernandez' 10 2011   4.1   9.678571 
       8 'Aaron Hernandez' 11 2011   4.4   9.678571 
       9 'Aaron Hernandez' 12 2011   6.2   9.678571 
       10 'Aaron Hernandez' 13 2011   4.3   9.678571 
       11 'Aaron Hernandez' 14 2011   8.4   9.678571 
       12 'Aaron Hernandez' 15 2011   20.5   9.678571 
       13 'Aaron Hernandez' 16 2011   3.7   9.678571 
       14 'Aaron Hernandez' 17 2011   22.4   9.678571 
       15 'Aaron Hernandez'  1 2012   12.4   8.755556 
       16 'Aaron Hernandez'  6 2012   9.0   8.755556 
       17 'Aaron Hernandez'  7 2012   5.4   8.755556 
       18 'Aaron Hernandez' 12 2012   3.6   8.755556 
       19 'Aaron Hernandez' 13 2012   9.7   8.755556 
       20 'Aaron Hernandez' 14 2012   17.8   8.755556", 
       header = TRUE, stringsAsFactors = FALSE) 
Verwandte Themen