4

我已经尝试了一段时间来生成一个代码,它为我带来一个原始向量的前 25 行总和的新向量。

因此,如果我们说我有一个包含 500 行的变量 Y,并且我想要一个运行总和,在一个新向量中,其中包含行的总和 [1:25] 然后 [2:26] 表示 Y 的长度,例如这:

y<-1:500
runsum<-function(x){
   cumsum(x)-cumsum(x[26:length(x)])
}

new<-runsum(y)

我尝试在这里使用一些不同的功能,然后甚至使用顶部的应用功能,但似乎没有一个能产生正确的答案......

有人能帮忙吗?我意识到这对这里的许多社区来说可能很容易,但任何帮助将不胜感激

谢谢

4

3 回答 3

3

此函数计算前面 24 个值和实际值的总和:

 movsum <- function(x,n=25){filter(x,rep(1,n), sides=1)}

如果这是您真正想要的,则很容易适应仅对前面的值求和。

于 2012-06-14T12:56:49.440 回答
3

除了 Roland 的回答,您还可以使用 zoo 库

library ( zoo )
y <- 1:500
rollapply ( zoo ( y ), 25, sum )

高温高压

于 2012-06-14T13:01:47.817 回答
1

我更喜欢 Roland 的答案,因为它依赖于时间序列函数,并且可能会很快。既然你提到你开始走上使用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
于 2012-06-14T13:03:46.707 回答