Перекрестные значения прокатки - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь выяснить способ вычисления значений скользящей суммы на основе вектора данных. Ниже приведен пример кадра данных и ответ, который я пытаюсь вычислить, но не могу найти правильное решение. По сути, я пытаюсь умножить каждое значение столбца 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 безрезультатно.

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 11 января 2019

Если цель состоит в том, чтобы вычислить скользящую сумму из 3 значений так, чтобы неявно добавлялись 0, чтобы гарантировать, что на выходе есть 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

2a) или возьмите накопленную сумму и вычтите совокупную сумму 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
0 голосов
/ 12 января 2019

Если кто-то захочет сделать аналогичный расчет по группам, приведенный ниже код должен сработать.

df_nest<-df%>% group_by(variable)%>%nest()

df_nest%>%
  mutate(NewColumn = map(data, ~rollapplyr(c(.$x*.$y, 0, 0), 3, sum, partial = TRUE)))%>%
  unnest()
0 голосов
/ 11 января 2019

Мы можем использовать

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...