4

元のベクトルの前の 25 行の合計の新しいベクトルをもたらすコードを生成するために、しばらくの間試みてきました。

したがって、500 行の変数 Y があり、行の合計 [1:25] と Y の長さの [2:26] を含む新しいベクトルで実行中の合計が必要な場合、次のようになります。これ:

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

ローランドの答えに加えて、動物園ライブラリを使用できます

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

HTH

于 2012-06-14T13:01:47.817 に答える
1

時系列関数に依存しており、おそらくかなり速いので、ローランドの答えが好きです。あなたがapply()友人を使用する道をたどり始めたと述べたので、これを行うための1つのアプローチを次に示します。

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 に答える