修改 R 中的 expand.grid 函数



我需要创建一个所有可能组合的矩阵。

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.tablecombn的输出操作为所需的格式可能会更快:

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

最新更新