我的问题是关于如何提高函数的性能,从矩阵的列中下采样而不用替换(又称为“稀疏矩阵”......我知道这里提到了这个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和我自己突出显示的代码中的问题 –