2016-12-06 6 views
0

Ich arbeite an einem rollierenden Durchschnitt einer Spalte, indem ich eine andere Spalte gruppiere. Die Gruppen sind "Spielername", der gleitende Durchschnitt ist "FDP". Hier ist die Testdaten Ich verwende:R-Programmierung - Rollender Durchschnitt mit Gruppierung

PlayerName <- c("Player1", "Player1", "Player1", "Player1", "Player2", "Player2", "Player2", "Player3", "Player3", "Player3", "Player3", "Player3", "Player3") 

Date <- c("2016-11-02", "2016-11-04", "2016-11-07", "2016-11-10", "2016-11-03", "2016-11-04", "2016-11-11", "2016-11-02", "2016-11-04", "2016-11-07", "2016-11-10", "2016-11-13", "2016-11-17") 

FDP <- c(13, 12, 8, 20, 10, 11, 12, 35, 46, 24, 33, 40, 40) 

DT <- data.table(PlayerName, Date, FDP) 

ich eine vierte Spalte „RollAvg“ hinzufügen mag, dass der 3 Datum gleitende Durchschnitt ist. Das Ergebnis wäre in etwa so aussehen:

PlayerName  Date FDP RollAvg 
1: Player1 2016-11-02 13 NA 
2: Player1 2016-11-04 12 NA 
3: Player1 2016-11-07 8 11 
4: Player1 2016-11-10 20 13.3 
5: Player2 2016-11-03 10 NA 
6: Player2 2016-11-04 11 NA 
7: Player2 2016-11-11 12 11 
8: Player3 2016-11-02 35 NA 
9: Player3 2016-11-04 46 NA 
10: Player3 2016-11-07 24 35 
11: Player3 2016-11-10 33 34.3 
12: Player3 2016-11-13 40 32.3 
13: Player3 2016-11-17 40 37.6 

Es spielt für mich keine Rolle, ob die RollAvg Spalte NA hat oder wenn sie weggelassen werden.

Ich habe eine Reihe von verschiedenen Möglichkeiten versucht, dies zu tun, und ich kann nichts zur Arbeit bekommen. Ich weiß, dass es andere ähnliche Beiträge gibt, aber ich konnte die Strukturen dessen, was sie taten, nicht verstehen. Ich habe das Gefühl, dass es einen einfachen Ein-Linien-Weg gibt, um dies mit Sapply und Rollmean zu machen, aber ich kann es nicht herausfinden.

Danke für die Hilfe!

+0

Zuvor beantwortet [Diese so Post] (http://stackoverflow.com/questions/33787526/grouped-rolling-average-by-date) – G5W

+0

Ich versuchte, das zu verwenden, und ich konnte es nicht zum Funktionieren bringen. Ich bin ein Neuling, also war es vielleicht gerade hinter mir. Danke für die Hilfe. – runnin4tay5000

Antwort

3

Wie mehrere andere SO posts vorschlagen, Sie nutzen die rollapply() Funktion des zoo Paket zu lösen dieses Problem machen kann:

library(zoo) 
library(dplyr) 

PlayerName <- c("Player1", "Player1", "Player1", "Player1", "Player2", "Player2", "Player2", "Player3", "Player3", "Player3", "Player3", "Player3", "Player3") 

Date <- c("2016-11-02", "2016-11-04", "2016-11-07", "2016-11-10", "2016-11-03", "2016-11-04", "2016-11-11", "2016-11-02", "2016-11-04", "2016-11-07", "2016-11-10", "2016-11-13", "2016-11-17") 

FDP <- c(13, 12, 8, 20, 10, 11, 12, 35, 46, 24, 33, 40, 40) 

data.frame(PlayerName, Date, FDP) %>% 
     mutate(Date = as.Date(Date)) %>% 
     arrange(PlayerName,Date) %>% 
     group_by(PlayerName) %>% 
     mutate(RollAvg = zoo::rollapply(FDP,3,mean,by = 1,align = "right",fill = NA)) 

, die zurückgibt:

Source: local data frame [13 x 4] 
Groups: PlayerName [3] 

    PlayerName  Date FDP RollAvg 
     <fctr>  <date> <dbl> <dbl> 
1  Player1 2016-11-02 13  NA 
2  Player1 2016-11-04 12  NA 
3  Player1 2016-11-07  8 11.00000 
4  Player1 2016-11-10 20 13.33333 
5  Player2 2016-11-03 10  NA 
6  Player2 2016-11-04 11  NA 
7  Player2 2016-11-11 12 11.00000 
8  Player3 2016-11-02 35  NA 
9  Player3 2016-11-04 46  NA 
10 Player3 2016-11-07 24 35.00000 
11 Player3 2016-11-10 33 34.33333 
12 Player3 2016-11-13 40 32.33333 
13 Player3 2016-11-17 40 37.66667 
+0

Vielen Dank für Ihre Hilfe. Ich hatte diesen Thread tatsächlich gefunden und konnte ihn nicht zum Laufen bringen. Nachdem ich deinen Code ausgeführt habe und es nicht funktioniert habe, habe ich festgestellt, dass ich R aktualisieren muss, und dann hat es perfekt funktioniert. Danke für die Hilfe. – runnin4tay5000

+0

Beachten Sie auch "Rollmeanr". –