Скользящее среднее по данным группы R.стол
Я хочу вычислить скользящее среднее значение YTD по группе, начиная с первой строки в группе и заканчивая последней строкой. Пример ниже...
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)
Столбец результатов-это то, что я ожидаю увидеть из скользящего среднего.
2 ответов:
Используя
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
Comments