我需要创建一个所有可能组合的矩阵。
L<-12
vec <- c(0:21)
lst <- lapply(numeric(L), function(x) vec)
Mat1<-as.matrix(expand.grid(lst))
结果将是非常大的矩阵,我的计算机无法计算它。 实际上,我只需要第一列中的值大于第二列中的值,第二列中的值大于第三列中的值的组合,依此类推。我可以以某种方式修改 expand.grid 函数以删除不必要的组合吗?
正如@AllanCameron所确定的,你所追求的相当于取大小为 12 的vec
的所有组合——你也可以使用内置函数combn
:
do.call(rbind, combn(vec, L, simplify = FALSE))
使用data.table
将combn
的输出操作为所需的格式可能会更快:
library(data.table)
setDT(transpose(combn(vec, L, simplify=FALSE))
您可以使用gtools
包中的combinations
轻松执行此操作:
result <- gtools::combinations(length(vec), L, vec)[, L:1]
该函数本身以递增的顺序提供列,因此子集的存在只是为了获得正确的顺序。
这是一个很大的矩阵,所以需要一些时间,但在我工作缓慢的PC上只有大约5秒:
microbenchmark::microbenchmark(combinations(22, 12, 21:0)[,12:1], times = 5)
Unit: seconds
expr min lq mean median uq max neval
combinations(22, 12, 21:0)[, 12:1] 4.965595 5.211964 5.261557 5.249413 5.341981 5.538831 5
我们可以看到前 5 行给出了正确的格式:
result[1:5,]
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
#> [1,] 11 10 9 8 7 6 5 4 3 2 1 0
#> [2,] 12 10 9 8 7 6 5 4 3 2 1 0
#> [3,] 13 10 9 8 7 6 5 4 3 2 1 0
#> [4,] 14 10 9 8 7 6 5 4 3 2 1 0
#> [5,] 15 10 9 8 7 6 5 4 3 2 1 0
并且我们有正确的尺寸:
dim(result)
#> [1] 646646 12