0

これは、適用の質問/データ管理の質問/それらの組み合わせである可能性があります。私はRに比較的慣れておらず、RとStataでデータを管理する方法を広範囲に調整しています(例として)。私は広範囲に読みましたが、(1)グループごとにデータフレームからベクトルを抽出する方法の良い例を見つけていません。(2) これらのベクトルのすべての組み合わせに対してペアごとに関数を適用します。(3) 結果を行列として出力するので、皆さんにお願いしたいことがあります。以下の例では、すべての変数名/データを単純化しました。

次のような構造のデータフレーム df があります。

id score1 score2 extravar1 extravar2 .....
1     10      9        a   1.4345124      
1      9      7        b   1.1133529
1      5      5        c   -0.1712851
2      4      4        d   -0.4924446
2      3      2     junk   -0.8136040
2      6      6     junk   0.14987444
3      5      6     junk   0.14331245
etc

ID スコア 1 サブセットと ID スコア 2 サブセットの共分散行列を作成する必要があります。つまり、score1 と score2 の両方に対して次の計算を実行したいと思います。

cov(vector of df$score1 for id 1 only,df$score1 for id 1 only) 
cov(vector of df$score1 for id 1 only,df$score1 for id 2 only)
cov(vector of df$score1 for id 1 only,df$score1 for id 3 only)
.
.
.
cov(vector of df$score1 for id 1 only,df$score1 for id 288 only)
cov(vector of df$score1 for id 1 only,df$score1 for id 289 only)
cov(vector of df$score1 for id 2 only,df$score1 for id 1 only) 
cov(vector of df$score1 for id 2 only,df$score1 for id 2 only)
.
.
.
cov(vector of df$score1 for id 289 only,df$score1 for id 288 only)
cov(vector of df$score1 for id 289 only,df$score1 for id 289 only)

データを 2 つ (score1 用に 1 つ、score2 用に 1 つ) のリスト、データフレーム、またはマトリックスに出力したいと思います (ここで、s1-1 は id=1 の score1 ベクトルです)。

         1               2               3       ...    288           289
1  cov(s1-1,s1-1)  cov(s1-1,s1-2) cov(s1-1,s1-3)   cov(s1-1,s1-288)   cov(s1-1,s1-289)
2  cov(s1-2,s1-1)  cov(s1-2,s1-2) cov(s1-2,s1-3)   cov(s1-2,s1-288)   cov(s1-2,s1-289)
3  cov(s1-3,s1-1)  cov(s1-3,s1-2) cov(s1-3,s1-3)   cov(s1-3,s1-288)   cov(s1-3,s1-289)
.
.
.
288 cov(s1-288,s1-1)  cov(s1-288,s1-2) cov(s1-288,s1-3) cov(s1-288,s1-288) cov(s1-288,s1-289)
289 cov(s1-289,s1-1)  cov(s1-289,s1-2) cov(s1-289,s1-3) cov(s1-289,s1-288) cov(s1-289,s1-289)

私の問題は、(1) そのような分析に適した形式になるようにデータを操作することと、(2) どの適用関数を使用するのが最も適切かを判断すること (おそらく maply?) に直面していることです。現在、分割を使用してデータをグループに分割していますが、そこから操作する方法がわかりません。

df.scores <- df[,c("id","score1","score2")]
databy.id <- split(df.scores,df.scores$id)

これにより、applyでの操作方法が100%明確ではないリストが得られます。head(databy.id) はおおよそ次のようになります。

$`1`
           id score1      score2 
1           1     10           9 
2           1      9           7 
3           1      5           5 
4           1      4           4 
5           1      3           2 
...

$`2`
           id score1      score2 
1           2      8           3 
2           2      9           2 
3           2     10           1 
4           2      9           3 
5           2      4           9 
...

$`3`
           id score1      score2 
1           3      8           7 
2           3      3           4 
3           3      2           3 
4           3      4           6 
5           3      6           1 
...

私はこれをループで解決できます (そして解決しました) が、次に繰り返しスコアをランダム化し、多くのそのような行列をシミュレート/保存する必要があるため (ループを介して非常に時間がかかります)、そうしないことを好みます。ddply、mapply、またはその他の関数を使用する必要がありますか? 続行する方法について何か提案はありますか?

4

1 に答える 1