交叉产品滚动值
Cross Prod Rolling Values
我正在尝试找出一种方法来计算基于向量的滚动总和值 data.Below 是一个样本数据框和我正在尝试计算的答案,但无法找出正确的解决方案.本质上,我试图将每个 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 个值的滚动总和,以便隐式添加 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) Base 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
如果有人想按组进行类似的计算,下面的代码应该有效。
df_nest<-df%>% group_by(variable)%>%nest()
df_nest%>%
mutate(NewColumn = map(data, ~rollapplyr(c(.$x*.$y, 0, 0), 3, sum, partial = TRUE)))%>%
unnest()
我正在尝试找出一种方法来计算基于向量的滚动总和值 data.Below 是一个样本数据框和我正在尝试计算的答案,但无法找出正确的解决方案.本质上,我试图将每个 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 个值的滚动总和,以便隐式添加 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) Base 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
如果有人想按组进行类似的计算,下面的代码应该有效。
df_nest<-df%>% group_by(variable)%>%nest()
df_nest%>%
mutate(NewColumn = map(data, ~rollapplyr(c(.$x*.$y, 0, 0), 3, sum, partial = TRUE)))%>%
unnest()