の100×100マトリックスはここ小さなデータ及び(data.table
を使用せずに)基地Rを有する例を示します。
#DATA
set.seed(42)
dt <- data.table(group=rep(1:5, each = 20), value = rnorm(20 * 5))
これは最初group
ためのユニークな要素のリストを取得した後、ユニークgroup
のすべてのペアに対応cor
value
間を実行することによって動作します。
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
私はちょうどループでそれをやってしまった、これは本当に読んで理解するのが簡単ではないように思えるだけの2つのループです。 –