我想從組中的第一行開始,到最後一行開始計算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)
結果列是我期望從滾動平均值中看到的。
我想從組中的第一行開始,到最後一行開始計算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)
結果列是我期望從滾動平均值中看到的。
使用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
或rollapplyr
從zoo
包:
dt[, res := rollapplyr(Sales, 1:.N, mean), by = Group]
或用鹼R:
ave(df$Sales, df$Group, FUN = function(x) cumsum(x)/seq_along(x))
我們可以用與dplyr
zoo
。 %>%
將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
是的,這很容易理解。純粹是因爲我更頻繁地使用數據表,所以它會保持我的代碼一致。 – MidnightDataGeek
@MidnightDataGeek當然,data.table會很快 – akrun
downvote太便宜了 – akrun
或用'從'zoo'包rollapplyr':'DT [,RES:= rollapplyr(銷售,1:.N,平均),通過=羣組]'(但你更優雅伊莫) – Jaap
或沒有額外的軟件包:'ave(df $ Sales,df $ Group,FUN = function(x)cumsum(x)/ seq_along(x))' – mtoto
@nachti謝謝,我一直在嘗試各種示例發現,但這是我錯過的'1:.N'。 – MidnightDataGeek