2011-07-29 1 views
9

私は4n mの行列を持っています(1年間7.5分の合計)。これらを30分合計に変換したいと思います。 70080 x 1を17520行列に変換します。マトリックスの各4行の合計を得る方法R

これを行う最も計算効率の高い方法は何ですか?

より詳細:ここでの例では、

library(lubridate) 
start.date <- ymd_hms("2009-01-01 00:00:00") 
n.seconds <- 192 # one day in seconds 
time <- start.date + c(seq(n.seconds) - 1) * seconds(450) 

test.data <- data.frame(time = time, 
         observation = sin(1:n.seconds/n.seconds * pi)) 

R版(一日の代わりに一年に短縮):2.13。プラットフォーム:x86_64-pc-linux-gnu(64-bit)

+0

:ここではXTSの例ですか? –

+1

あなたのタイトルと最初の文章は異なる情報を提供します。追加の情報を追加し、[この問題で説明されている](http://www.stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) –

+1

@ヨリス私はそれをお詫び申し上げます。私は私の質問を更新しました。 – Abe

答えて

16
colSums(matrix(test.data$observation, nrow=4)) 
+0

nice、simple _and_ fast – Abe

7

あなたの質問はかなりあいまいなので、私は狂った仮定を立てます。

あなたのデータは7.5分ごとの観測値を持つ行列であり、空間インデックスはありません。したがって、100行は次のようになります。

data <- matrix(rnorm(400), ncol=4) 

そして、4行のチャンクを合計したいとします。

これを行う方法はたくさんありますが、私の頭の中で最初にホッピングするのは、インデックスを作成してから、「グループ化」と合計のRバージョンを作成することです。

例インデックスはこのようなものが考えられます。だから今、私たちはデータと同じ長さの指標を持っていることを

index <- rep(1:25, 4) 
index <- index[order(index)] 

を、あなたは物事をまとめるためにaggregate()を使用することができます。

aggregate(x=data, by = list(index), FUN=sum) 

編集:

上記の方法の精神は依然として有効です。しかし、timeseriesデータで多くのことを行う場合は、xtsパッケージを知っているはずです。行列は時間インデックスを表す列を持っているん

require(xts) 
test.xts <- xts(test.data$observation, order.by=test.data$time) 
period.apply(test.xts, endpoints(test.xts,"minutes", 30), sum) 
+0

あなたの有益な答えをありがとう、私は私の曖昧さをお詫び申し上げます。私は時間の列を含む例で私の答えを更新しました。 – Abe

2
sapply(split(test.data$observation, rep(1:(192/4), each=4)), sum) 
関連する問題