4

次のように、個人指向の形式の縦断データを含むデータセットがあります。

pid varA_1 varB_1 varA_2 varB_2 varA_3 varB_3 ...
1   1      1      0      3      2      1
2   0      1      0      2      2      1
...
50k 1      0      1      3      1      0

これにより、最小 50k の観測値と最大 29 期間にわたって測定された 90 の変数を含む大きなデータフレームが生成されます。

次のように、より期間指向の形式を取得したいと思います。

pid index start stop varA varB varC ...
1   1     ...
1   2     
...
1   29
2   1

データフレームを再形成するためのさまざまなアプローチを試しました ( *applyplyrreshape2、ループ、すべての数値行列の追加と事前入力など) が、まともな処理時間 (サブセットの場合は +40 分) が得られないようです。何を避けるべきかについて途中でさまざまなヒントを拾いましたが、ボトルネックやスピードアップの可能性を見落としているかどうかはまだわかりません.

純粋な R コードで達成できる最良の処理時間を評価できるように、この種のデータ処理にアプローチする最適な方法はありますか? Stackoverflow にも同様の質問がありましたが、納得のいく回答にはなりませんでした...

4

2 に答える 2

3

まず、データの例を作成しましょう (構成でのメモリの問題を回避するために、50e3 の代わりに 5e3 を使用しています)。

nObs <- 5e3
nVar <- 90
nPeriods <- 29

dat <- matrix(rnorm(nObs*nVar*nPeriods), nrow=nObs, ncol=nVar*nPeriods)

df <- data.frame(id=seq_len(nObs), dat)

nmsV <- paste('Var', seq_len(nVar), sep='')
nmsPeriods <- paste('T', seq_len(nPeriods), sep='')

nms <- c(outer(nmsV, nmsPeriods, paste, sep='_'))
names(df)[-1] <- nms

そして今stats::reshape、フォーマットを変更してください:

df2 <- reshape(df, dir = "long", varying = 2:((nVar*nPeriods)+1), sep = "_")

これがあなたが探している迅速な解決策であるかどうかはわかりません。

于 2011-10-17T10:05:44.203 に答える
1

よく熟成された stack() 関数は、物事がメモリに収まる場合、非常に高速になる可能性があります。

大規模なセットの場合、(透過的な) sqlite データベースを中間として使用するのが最適です。Gabor のパッケージ sqldf を試してみてください。googlecode には多くの例があります。

http://code.google.com/p/sqldf/

于 2011-10-17T09:17:23.003 に答える