2017-12-11 17 views
0

私は、負でない値とy_1、...、y_pという名前の列だけを持つnxp非常に疎なカウント行列を持っています。 (n = 200万、p = 70)カウントマトリックスから隣接行列を得る方法

Rを使って、y_iとy_jが同じ行に0以外の値を持つ回数を数える行列に変換します。

例:

ID a b c d e 
1 1 0 1 0 0 
2 0 1 1 0 0 
3 0 0 1 1 0 
4 1 1 0 0 0 

と私は取得したい:

- a b c d e 
a 2 1 1 0 0 
b 1 2 1 0 0 
c 1 1 3 1 0 
d 0 0 1 1 0 
e 0 0 0 0 0 
+0

小さな再現可能な例を投稿できますか?コピー/ペースト可能なものが最適です。サンプル入力を生成するためのコードを共有する( 'dput()'はこれには便利です)、その入力に対して望ましい出力を表示します。 – Gregor

+0

確かに、私はそれを投稿しました。ありがとう – user40076

答えて

1

これは、単純な行列乗算です。

t(m) %*% m 
    a b c d e 
a 2 1 1 0 0 
b 1 2 1 0 0 
c 1 1 3 1 0 
d 0 0 1 1 0 
e 0 0 0 0 0 

このデータを使用して:

m = read.table(text = "ID a b c d e 
1 1 0 1 0 0 
2 0 1 1 0 0 
3 0 0 1 1 0 
4 1 1 0 0 0", header = T) 
m = as.matrix(m[, -1]) 

をこれは、元の行列のみが1と0であることに依存しています。私のラップトップ上で

library(Matrix) 
nr = 2e6 
nc = 70 
mm = Matrix(0, nrow = nr, ncol = nc, sparse = T) 

# make, on average, three 1s per row 
set.seed(47) 
mm[cbind(sample(nr, size = 3 * nr, replace = T), sample(nc, size = 3 * nr, replace = T))] = 1 

system.time({res = t(mm) %*% mm}) 
    # user system elapsed 
    # 0.836 0.057 0.895 
format(object.size(res), units = "Mb") 
[1] "0.1 Mb 

を計算は秒未満を取り、結果はおよそ次のとおりです。そうでない場合は、あなたが記述のようにここでは、行列に取り組んでいますm = original_matrix > 0


でそれを作成することができます0.1Mb。

+0

私は乗算を計算できません(サイズ1.2GBのベクトルを割り当てることはできません)。私の初期行列は200万で70です。 – user40076

+0

imは結果として70x70行列を期待しています。私の最初の行列は非常にまばらです、平均値は行ごとに3つの値です – user40076

+0

ああ、行と列を切り替えました。それはまばらな行列オブジェクトですか?それが本当に問題ではないはずです。 – Gregor

関連する問題