2016-06-23 41 views
2

我想從組中的第一行開始,到最後一行開始計算YTD的年平均滾動平均值。下面的示例...按組R滾動平均data.table

Group <- c(rep("a",5), rep("b",5)) 
Sales <- c(2,4,3,3,5,9,7,8,10,11) 
Result <- c(2,3,3,3,3.4,9,8,8,8.5,9) 
df <- data.frame(Group, Sales, Result) 

結果列是我期望從滾動平均值中看到的。

回答

8

使用cumsum

dt <- as.data.table(df) 
dt[, res := cumsum(Sales)/(1:.N), by = Group] 
dt 
    Group Sales Result res 
1:  a  2 2.0 2.0 
2:  a  4 3.0 3.0 
3:  a  3 3.0 3.0 
4:  a  3 3.0 3.0 
5:  a  5 3.4 3.4 
6:  b  9 9.0 9.0 
7:  b  7 8.0 8.0 
8:  b  8 8.0 8.0 
9:  b 10 8.5 8.5 
10:  b 11 9.0 9.0 

rollapplyrzoo包:

dt[, res := rollapplyr(Sales, 1:.N, mean), by = Group] 

或用鹼R:

ave(df$Sales, df$Group, FUN = function(x) cumsum(x)/seq_along(x)) 
+0

或用'從'zoo'包rollapplyr':'DT [,RES:= rollapplyr(銷售,1:.N,平均),通過=羣組]'(但你更優雅伊莫) – Jaap

+0

或沒有額外的軟件包:'ave(df $ Sales,df $ Group,FUN = function(x)cumsum(x)/ seq_along(x))' – mtoto

+0

@nachti謝謝,我一直在嘗試各種示例發現,但這是我錯過的'1:.N'。 – MidnightDataGeek

1

我們可以用與dplyrzoo%>%將lhs與rhs連接起來,並且很容易理解並執行它。

library(dplyr) 
library(zoo) 
df %>% 
    group_by(Group) %>% 
    mutate(Sales = rollapplyr(Sales, row_number(), mean)) 
# Group Sales Result 
# <fctr> <dbl> <dbl> 
#1  a 2.0 2.0 
#2  a 3.0 3.0 
#3  a 3.0 3.0 
#4  a 3.0 3.0 
#5  a 3.4 3.4 
#6  b 9.0 9.0 
#7  b 8.0 8.0 
#8  b 8.0 8.0 
#9  b 8.5 8.5 
#10  b 9.0 9.0 
+1

是的,這很容易理解。純粹是因爲我更頻繁地使用數據表,所以它會保持我的代碼一致。 – MidnightDataGeek

+1

@MidnightDataGeek當然,data.table會很快 – akrun

+0

downvote太便宜了 – akrun