Я пытаюсь найти способ вычисления значений скользящей суммы на основе вектора данных. Ниже приведен образец фрейма данных и ответ, который я пытаюсь вычислить, но не могу найти правильного решения. По сути, я пытаюсь умножить каждое значение столбца x на вектор y и суммировать на основе периода.
period= c(1,2,3)
x=c(1,1,1)
y= c(2,3,4)
df=data.frame(period,x,y)
This is how I solved the answer.
2+0+0
3+2+0
4+3+2
0+4+3
0+0+4
answer= c(2,5,9,7,4)
Я просмотрел пакет slam, а также функцию crossprod безрезультатно.
Заранее спасибо!





Мы можем использовать
c(cumsum(df$y), rev(cumsum(rev(df$y)))[-1])
# [1] 2 5 9 7 4
cumsum(df$y) дает кумулятивную сумму, начиная с одного конца, затем rev(cumsum(rev(df$y)) дает, начиная с другого, и у нас есть [-1], поскольку полные суммы совпадают:
cumsum(df$y)
# [1] 2 5 9
rev(cumsum(rev(df$y)))
# [1] 9 7 4
Если цель состоит в том, чтобы вычислить скользящую сумму из 3 значений, чтобы неявно добавлялись нули, чтобы гарантировать, что на выходе будет 5 элементов, даже если на входе 3, попробуйте следующее:
1) rollapply (роллприменить) Умножьте x и y и вставьте 0 в зависимости от того, используется ли выравнивание по правому, центральному или левому краю и в зависимости от того, используется ли partial=. align = "center" - это значение по умолчанию для rollapply, а align = "right" - значение по умолчанию для rollapplyr.
library(zoo)
rollapply(c(0, x*y, 0), 3, sum, partial = TRUE)
## [1] 2 5 9 7 4
rollapplyr(c(x*y, 0, 0), 3, sum, partial = TRUE)
## [1] 2 5 9 7 4
rollapplyr(c(0, 0, x*y), 3, sum, align = "left", partial = TRUE)
## [1] 2 5 9 7 4
rollapply(c(0, 0, x*y, 0, 0), 3, sum)
## [1] 2 5 9 7 4
rollsum(c(0, 0, x*y, 0, 0), 3) # this solution has the lowest character count
## [1] 2 5 9 7 4
2) База R Базовое решение можно записать с помощью embed:
rowSums(embed(c(0, 0, x*y, 0, 0), 3))
## [1] 2 5 9 7 4
2а) или возьмите кумулятивную сумму и вычтите кумулятивную сумму 3 обратно:
cumsum(c(x*y,0,0)) - cumsum(c(0, 0, 0, (x*y)[-3]))
## [1] 2 5 9 7 4
2b) Если идея состоит в том, что необходимо выполнить циклический расчет, тогда:
c(filter(c(0, x*y, 0), c(1,1,1), circular = TRUE))
## [1] 2 5 9 7 4
спасибо за все предложения, это то, что я искал.
Если кто-то хочет провести аналогичный расчет по группам, приведенный ниже код должен работать.
df_nest<-df%>% group_by(variable)%>%nest()
df_nest%>%
mutate(NewColumn = map(data, ~rollapplyr(c(.$x*.$y, 0, 0), 3, sum, partial = TRUE)))%>%
unnest()
Какую роль в этом играет
period?