2012-06-14 26 views
4

我一直在尝试一段时间来产生一个代码,该代码给我带来了一个新的25个先前行的总和的矢量。前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

[可能重复(http://stackoverflow.com/questions/10930810/cumulative-sum-for -n-rows) – Roland

回答

3

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

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

它如果这是你真正想要的,很容易适应只和前面的值相加。

3

除了罗兰的回答,您可以使用该动物园库

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

HTH

+0

这里可以通过动态25吗?即值的向量 – deltascience

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 
+0

谢谢 - 它有助于看到应用函数以与我的工作相关的方式使用 - 我会尝试这种方式,所以我至少知道它是如何工作的! – Ash