【问题标题】:Modification of expand.grid function in RR中expand.grid函数的修改
【发布时间】:2020-02-16 09:06:29
【问题描述】:

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

L<-12 
vec <- c(0:21)
lst <- lapply(numeric(L), function(x) vec)
Mat1<-as.matrix(expand.grid(lst))

结果将是非常大的矩阵,我的计算机无法计算它。 实际上,我只需要第一列中的值大于第二列中的值,第二列中的值大于第三列中的值的组合,依此类推。我可以以某种方式修改 expand.grid 函数以删除不必要的组合吗?

【问题讨论】:

  • 向量 0:21 真的是您感兴趣的数字,还是只是为了给我们一些工作而创建的样本向量?如果是,那么下面基于组合的答案将起作用,否则它们不会...
  • @Spacedman IINM 更强大的版本将处理 (1) 重复和 (2) 缺失值。我认为 OP 的主要问题是创建一个巨大的 22^12 大小(380 petabit)输出(不可能)并根据他的需要进行子集化——下面的两个答案都解决了这个问题,并且 IINM 可以通过一些进一步的子集来修复以适应这些概括
  • 如果组成向量甚至没有排序怎么办?这就是为什么我想在这种情况下发布答案之前要求澄清!我想 OP 确实说“组合”,这可能意味着 combn(0:21,11) (或类似的)......

标签: r


【解决方案1】:

正如@AllanCameron 所指出的,您所追求的等同于采用大小为 12 的 vec 的所有组合——您也可以为此使用内置函数 combn

do.call(rbind, combn(vec, L, simplify = FALSE))

使用data.tablecombn 的输出操作为所需格式可能会更快:

library(data.table)
setDT(transpose(combn(vec, L, simplify=FALSE))

【讨论】:

  • 我猜这里应该使用rev(vec),因为OP“只需要第一列中的值大于第二列中的值的组合,第二列中的值大于第三列中的值等等。”
  • @ThomasIsCoding 确实如此!或者,将data.table 解决方案分配为x,我们可以执行setcolorder(x, ncol(x):1)
【解决方案2】:

您可以使用 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

【讨论】:

    猜你喜欢
    • 2012-08-21
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 2012-01-15
    • 1970-01-01
    • 2014-12-20
    相关资源
    最近更新 更多