我的問題是關於如何提高函數的性能,從矩陣的列中下采樣而不用替換(又稱爲「稀疏矩陣」......我知道這裏提到了這個here,但是我找不到明確答案a)做我需要的; 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)
}
我需要進行採樣矩陣與數以百萬計的條目。我覺得這是相當緩慢(在這裏我使用1000×1000矩陣,這大約是20-100x比我典型的數據尺寸):
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
是否有執行該操作更快/更簡單的方法,我有沒有想過?
以爲你想在最後一行中使用'return(data.test)'。另外,混合賦值運算符('<-'和'=')會令人困惑。可能是堅持一個好主意。 – lmo
您是否也可以修復這些錯誤以使您的代碼可重現?你說你正在製作一個1000X1000矩陣,但實際上你有3300列和5000行指定,並且代碼不起作用,因爲它不符合列和行名稱的長度。另外,你可以定義函數'downsampled',但是然後嘗試調用'downsampledata'。 –
僅供參考我編輯修復了@lmo和我自己突出顯示的代碼中的問題 –