私が構築しようとしている「署名マトリックス」のフィールドに適切な既存の名前または定義があるかどうかはわかりませんが、次のコードはいくつかのおもちゃのマトリックスで正しい結果を生成するようです。混乱を招かずに何をしようとしているのかを正確に説明するのに苦労していますが、提供したコードが私がやろうとしていることを推測するのに十分でない場合は、喜んで試してみます.
実際のデータ (サイズが約 300 x 20,000 の 2 つの整数行列) でこのコードを実行すると、動作しているように見えますが、何時間も経ってもまだ終了しません。
ここで反復が最大の問題になる可能性があることは理解していますが、それを取り除く方法を見つけることができませんでした。
コード:
# Load required library
library(Matrix)
# Load in the test data
mut <- matrix(data=c(1,1,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,0,1,0),
nrow=5,ncol=4,
dimnames=list(c("p1","p2","p3","p4","p5"),c("GA","GB","GC","GD")))
oute <- matrix(data=c(1,1,0,1,0,1,0,0,1,1,1,1,1,0,0,1,1,0,0,1),
nrow=5,ncol=4,
dimnames=list(c("p1","p2","p3","p4","p5"),c("GQ","GW","GE","GR")))
patOutMatrix <- Matrix(data=oute,sparse=TRUE)
patMutMatrix <- Matrix(data=mut,sparse=TRUE)
transposePatMutMatrix <- t(patMutMatrix)
# Build the empty matrix (with row and col names)
sigMatrix <- Matrix(0,nrow=ncol(patMutMatrix), ncol=ncol(patOutMatrix),sparse=TRUE)
rownames(sigMatrix) <- colnames(patMutMatrix)
colnames(sigMatrix) <- colnames(patOutMatrix)
# Populate sigMatrix
for (mgene in rownames(transposePatMutMatrix))
{
a <- patOutMatrix[which(transposePatMutMatrix[mgene, ] == 1, arr.ind = T), ]
# Using an IF here to get around a problem with colSums() not working on single rows
sigMatrix[mgene,] <- if (dim(as.matrix(a))[2] == 1) {
a
} else {
colSums(patOutMatrix[which(transposePatMutMatrix[mgene, ] == 1, arr.ind = T), ])
}
}
これをより速く実行するためにここで何かを変更する方法を知っている人はいますか?