2017-07-25 25 views
1

1つの列を持つデータフレームがあります。グループごとに相関行列を計算します。各グループの行数は同じですが、メモリの制約のためにキャストする必要のない大きなデータフレームです。書き直すことなくRでこれを行う方法はありますか?相関行列を1つの列にグループ化する

EX:

dt <- data.table(group=rep(1:100,each=100000), value=rnorm(100000*100)) 
some_corr_function_not_requiring_recast(dt, value, by=group) 

が返すべき相関

答えて

1

の100×100マトリックスはここ小さなデータ及び(data.tableを使用せずに)基地Rを有する例を示します。

#DATA 
set.seed(42) 
dt <- data.table(group=rep(1:5, each = 20), value = rnorm(20 * 5)) 

これは最初groupためのユニークな要素のリストを取得した後、ユニークgroupのすべてのペアに対応corvalue間を実行することによって動作します。

groups = unique(dt$group) 
sapply(1:length(groups), function(i) 
    sapply(1:length(groups), function(j) 
     cor(x = dt$value[dt$group == groups[i]], y = dt$value[dt$group == groups[j]]))) 
#   [,1]   [,2]  [,3]  [,4]   [,5] 
#[1,] 1.00000000 0.436949356 0.04324370 -0.03960938 0.281518699 
#[2,] 0.43694936 1.000000000 0.03976509 -0.06555478 0.005944951 
#[3,] 0.04324370 0.039765093 1.00000000 0.33289052 0.211291403 
#[4,] -0.03960938 -0.065554780 0.33289052 1.00000000 -0.183091610 
#[5,] 0.28151870 0.005944951 0.21129140 -0.18309161 1.000000000 

も作り直すことなく、動作しますが、groupに基づいてリストにdtを分割する必要が別のアプローチ。

temp = split(dt, dt$group) 
sapply(1:length(temp), function(i) 
    sapply(1:length(temp), function(j) 
     cor(x = temp[[i]]$value, y = temp[[j]]$value))) 
#   [,1]   [,2]  [,3]  [,4]   [,5] 
#[1,] 1.00000000 0.436949356 0.04324370 -0.03960938 0.281518699 
#[2,] 0.43694936 1.000000000 0.03976509 -0.06555478 0.005944951 
#[3,] 0.04324370 0.039765093 1.00000000 0.33289052 0.211291403 
#[4,] -0.03960938 -0.065554780 0.33289052 1.00000000 -0.183091610 
#[5,] 0.28151870 0.005944951 0.21129140 -0.18309161 1.000000000 
+0

私はちょうどループでそれをやってしまった、これは本当に読んで理解するのが簡単ではないように思えるだけの2つのループです。 –

関連する問題