4

「カウント」と言う、突然変異カウントのマトリックスが1つあります。この行列には、列名 V1、V2、...、Vi、...Vn があり、すべての "i" が存在するわけではありません。したがって、V1、V2、V5 のようにジャンプできます。さらに、ほとんどの列には 0 が含まれています。

「答え」と呼ばれる合計行列を作成する必要があります。ここで、要素 i、j は i と j の両方でのカウント数の合計です。i, i 要素では、i でのカウント数を表示するだけです。

ここでは、簡単なデータ設定を行います。「answer」というコードで、正しい次元のマトリックスが既に設定されています。したがって、自動化する必要があるのは、マトリックスに入力する最後の数行です。

counts <- matrix(data = c(0,2,0,5,0,6,0), nrow = 1, ncol = 7,    dimnames=list("",c("V1","V2","V3","V4","V5","V6","V7")))

answer <- matrix(data =0, nrow = 3, ncol = 3, dimnames = list(c("V2","V4","V6"),c("V2","V4","V6")))

answer[1,1] <- 2
answer[1,2] <- 7
answer[1,3] <- 8
answer[2,1] <- 7
answer[2,2] <- 5
answer[2,3] <- 11
answer[3,1] <- 8
answer[3,2] <- 11
answer[3,3] <- 6

ネストされた 2 つの for ループでこれを実行できることは理解していますが、もっと良い方法があるに違いありません。ありがとう!

4

1 に答える 1

4

expand.gridこれは、との正しい使用で行うことができますrowSums

n = counts[, counts > 0]
answer = matrix(rowSums(expand.grid(n, n)), nrow=length(n), dimnames=list(names(n), names(n)))
diag(answer) = n

それがどのように機能するかを示すために、n最終的には次のようになります。

V2 V4 V5 
 2  5  6 

そして次のexpand.grid(n, n)ようになります:

  Var1 Var2
1    2    2
2    5    2
3    6    2
4    2    5
5    5    5
6    6    5
7    2    6
8    5    6
9    6    6

最後の行(diag)が必要なのは、そうしないと対角線が元のベクトルの2倍になるためです(、、、2+2または5+5を追加6+6)。

于 2013-03-10T03:12:56.763 に答える