2016-12-06 58 views
0

我正在通過對另一列進行分組來做滾動平均值。這些組是「PlayerName」,滾動平均值是「FDP」。這裏是我正在使用的測試數據:R編程 - 帶分組的滾動平均值

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) 

我想添加第4列「RollAvg」,這是3日期滾動平均值。結果看起來是這樣的:

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 

如果RollAvg列具有NA或者它們被忽略,對我無關緊要。

我已經嘗試了一堆不同的方法來做到這一點,我不能得到任何工作。我知道還有其他類似的帖子,但我無法得到他們正在做的工作的結構。我覺得用sapply和rollmean有一些簡單的方法來做到這一點,但我無法弄清楚。

感謝您的幫助!

+0

由[這個SO郵政]以前回答(http://stackoverflow.com/questions/33787526/grouped-rolling-average-by-date) – G5W

+0

我試過使用它,我無法得到它的工作。我是一個新手,所以也許它只是在我之外。謝謝您的幫助。 – runnin4tay5000

回答

3

其他幾個SO posts建議,你可以使用zoo封裝的rollapply()功能來解決這個問題:

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)) 

返回:

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

謝謝你的幫助。我實際上已經找到了該線程,但無法啓動它。在我運行你的代碼後,它無法工作,或者我發現我需要更新R,然後它完美地工作。感謝您的幫助。 – runnin4tay5000

+0

另請注意'rollmeanr'。 –