R中expand.grid函数的修改
我需要创建一个包含所有可能组合的矩阵R中expand.grid函数的修改,r,R,我需要创建一个包含所有可能组合的矩阵 L<-12 vec <- c(0:21) lst <- lapply(numeric(L), function(x) vec) Mat1<-as.matrix(expand.grid(lst)) L您可以使用gtools软件包中的组合轻松完成此操作: result[,1][,2][,3][,4][,5][,6][,7][,8][,9][,10][,11][,12] #> [1,] 11 10 9 8 7
L<-12
vec <- c(0:21)
lst <- lapply(numeric(L), function(x) vec)
Mat1<-as.matrix(expand.grid(lst))
L您可以使用gtools
软件包中的组合
轻松完成此操作:
result[,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
正如@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))
向量0:21真的是你感兴趣的数字吗,还是仅仅是一个样本向量,用来给我们一些工作?如果是,那么下面基于组合的答案将起作用,否则它们不会…@Spacedman IINM更健壮的版本将处理(1)重复和(2)缺失值。我认为OP的主要问题是创建一个巨大的22^12大小(380 PB)的输出(不可能)&他需要的子集——下面的两个答案都解决了这个问题,IINM可以用几个进一步的子集来修正,以适应这些概化。如果组成向量甚至没有排序呢?这就是为什么我喜欢在这样的情况下发布答案之前要求澄清!我想OP确实说了“组合”,这可能意味着combn(0:21,11)(或类似)…我想这里应该使用rev(vec)
,因为OP“只需要组合,其中第一列中的值大于第二列中的值,第二列中的值大于第三列中的值,依此类推。”@thomasscoding yes!或者,使用data.table
解决方案分配为x
,我们可以执行setcolorder(x,ncol(x):1)
library(data.table)
setDT(transpose(combn(vec, L, simplify=FALSE))