Мой вопрос о том, как улучшить производительность функции, которая уменьшает выборку из столбцов матрицы без замены (например, «разрежение» матрицы ... Я знаю, что упоминалось об этом here, но я не мог найти ясный ответ: а) делает то, что мне нужно; б) делает это быстро).Матрица понижающего матрица в 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)
}
мне нужна субдискретизация матрицы с миллионами записей. Я считаю, что это довольно медленно (здесь я использую матрицу 1000x1000, что составляет около 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'. –
FYI Я внес изменения для исправления проблем в коде, выделенном @lmo и мной –