2012-06-14 64 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