我现在已经尝试了一段时间来生成一个代码,该代码为我提供了原始向量的前25行总和的新向量。
因此,如果我们说我有一个500行的变量Y并且我想要一个运行总和,在一个新的向量中,其中包含行的总和[1:25],然后[2:26]为Y的长度,比如这个:
y<-1:500
runsum<-function(x){
cumsum(x)-cumsum(x[26:length(x)])
}
new<-runsum(y)
我尝试过使用一些不同的功能,然后甚至使用顶部的应用功能,但似乎没有产生正确的答案....
有人能帮忙吗?我意识到这对很多社区来说可能非常容易,但任何帮助都会受到赞赏
谢谢
答案 0 :(得分:3)
此函数计算前24个值和实际值的总和:
movsum <- function(x,n=25){filter(x,rep(1,n), sides=1)}
如果这是您真正想要的,那么很容易适应仅前面值的总和。
答案 1 :(得分:3)
除了Roland的答案,您还可以使用动物园图书馆
library ( zoo )
y <- 1:500
rollapply ( zoo ( y ), 25, sum )
HTH
答案 2 :(得分:1)
我更喜欢罗兰的答案,因为它依赖于时间序列功能,可能会非常快。既然你提到你开始使用apply()
和朋友的路径,这里有一种方法:
y<-1:500
#How many to sum at a time?
n <- 25
#Create a matrix of the appropriate start and end points
mat <- cbind(start = head(y, -(n-1)), end = tail(y, -(n-1)))
#Check output
rbind(head(mat,3), tail(mat,3))
#-----
start end
1 25
2 26
3 27
[474,] 474 498
[475,] 475 499
[476,] 476 500
#add together
apply(mat, 1, function(x) sum(y[x[1]]:y[x[2]]))
#Is it the same as Roland's answer after removing the NA values it returns?
all.equal(apply(mat, 1, function(x) sum(y[x[1]]:y[x[2]])),
movsum(y)[-c(1:n-1)])
#-----
[1] TRUE