私の質問は、行列の列からの置き換えを行わない関数のパフォーマンスを改善する方法です(行列の「希少化」とも呼ばれます...)。このhereの言及がありますが、私に必要なものを行うことを明確に答えます。 b)すぐにそれをする)。Rのダウンサンプル行列?
downsampled <- function(data,samplerate=0.8) {
data.test <- apply(data,2,function(q) {
names(q) <- rownames(data)
samplepool <- character()
for (i in names(q)) {
samplepool <- append(samplepool,rep(i,times=q[i]))
}
sampled <- sample(samplepool,size=samplerate*length(samplepool),replace = F)
tab <- table(sampled)
mat <- match(names(tab),names(q))
toret=numeric(length <- length(q))
names(toret) <- names(q)
toret[mat] <- tab
return(toret)
})
return(data.test)
}
は、私は数百万のエントリを持つ行列をダウンサンプリングする必要があります
は、ここに私の関数です。私は(ここで私は一般的なデータサイズの約20-100x小さい1000×1000の行列を、使用しています)、これは非常に遅いです見つける:
mat <- matrix(sample(0:40,1000*1000,replace=T),ncol=1000,nrow=1000)
colnames(mat) <- paste0("C",1:1000)
rownames(mat) <- paste0("R",1:1000)
system.time(matd <- downsampled(mat,0.8))
## user system elapsed
## 69.322 21.791 92.512
はIこの操作を実行するためのより迅速/簡単な方法があります考えていない?
あなたの最後の行に 'return(data.test)'を入れたいと思っています。また、代入演算子( '< - 'と '=')を混在させるのは混乱します。おそらく1つのことにこだわることをお勧めします。 – lmo
コードを再現できるようにバグを修正することはできますか?あなたは1000X1000行列を作っていると言っていますが、実際には3300列と5000行が指定されており、列名と行名の長さと一致しないためコードは機能しません。また、関数 'downsampled'を定義した後、' downsampledata'を呼び出そうとします。 –
FYI @lmoと自分で強調表示されたコードの問題を修正するために編集しました –