你的方法:
op <- function(){
ncomb <- combn(20, 7)
ncombsub <- ncomb[, sample(choose(20,7), 5000)]
return(ncombsub)
}
了不同的策略,簡單的樣品從原來的矩陣七行5000次(直到5000個唯一的行組合找到了一個新的樣本來替換任何重複的樣品):
me <- function(){
rowsample <- replicate(5000,sort(sample(1:20,7,FALSE)),simplify=FALSE)
while(length(unique(rowsample))<5000){
rowsample <- unique(rowsample)
rowsample <- c(rowsample,
replicate(5000-length(rowsample),
sort(sample(1:20,7,FALSE)),simplify=FALSE))
}
return(do.call(cbind,rowsample))
}
這應該是更有效率,因爲它可以防止您必須首先計算所有組合,隨着矩陣變大,這會變得昂貴。
然而,一些基準測試顯示情況並非如此。至少在這個矩陣:
library(microbenchmark)
microbenchmark(op(),me())
Unit: milliseconds
expr min lq median uq max neval
op() 184.5998 201.9861 206.3408 241.430 299.9245 100
me() 411.7213 422.9740 429.4767 474.047 490.3177 100
是的,我認爲這是可能通過修改'combn '或者編寫自己的函數(這可能會更簡單)。用這個算法來實現它並不難。 – Roland
你可能想看到相關的帖子[這裏](http://stackoverflow.com/questions/4493287/generating-a-very-large-matrix-of-string-combinations-using-combn-and-bigmemor) – Metrics
@按照你的建議,羅蘭我最終修改了'combn()'。效果很好。 – Alex