生成vector元素的所有可能组合的列表

我试图在长度为14的vector中生成0和1的所有可能的组合。有没有一种简单的方法来获得输出作为向量列表,甚至更好,一个dataframe?

为了更好地展示我正在寻找的内容,我们假设我只想要一个长度为3的向量。我希望能够生成以下内容:

(1,1,1), (0,0,0), (1,1,0), (1,0,0), (1,0,1), (0,1,0), (0,1,1), (0,0,0) 

任何帮助将不胜感激!

谢谢,

您正在寻找expand.grid

 expand.grid(0:1, 0:1, 0:1) 

或者,对于长期的情况:

 n <- 14 l <- rep(list(0:1), n) expand.grid(l) 

作为@ Justin方法的替代方法,您也可以使用“data.table”包中的CJ 。 在这里,我也利用replicate创build了14个零和一个列表。

 library(data.table) do.call(CJ, replicate(14, 0:1, FALSE)) # V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 # 1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 # 2: 0 0 0 0 0 0 0 0 0 0 0 0 0 1 # 3: 0 0 0 0 0 0 0 0 0 0 0 0 1 0 # 4: 0 0 0 0 0 0 0 0 0 0 0 0 1 1 # 5: 0 0 0 0 0 0 0 0 0 0 0 1 0 0 # --- # 16380: 1 1 1 1 1 1 1 1 1 1 1 0 1 1 # 16381: 1 1 1 1 1 1 1 1 1 1 1 1 0 0 # 16382: 1 1 1 1 1 1 1 1 1 1 1 1 0 1 # 16383: 1 1 1 1 1 1 1 1 1 1 1 1 1 0 # 16384: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 

有16384种可能的排列组合。 您可以使用iterpc包来迭代获取结果。

 library(iterpc) I = iterpc(2, 14, label=c(0,1), order=T, replace=T) getnext(I) # [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 getnext(I) # [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 1 getnext(I) # [1] 0 0 0 0 0 0 0 0 0 0 0 0 1 0 

如果你想要所有的结果,你仍然可以使用getall(I)

由于你正在处理0和1,所以用位来考虑整数似乎很自然。 使用这个post稍微修改过的函数(下面的MyIntToBit ),以及你select的apply函数,我们可以得到想要的结果。

 MyIntToBit <- function(x, dig) { i <- 0L string <- numeric(dig) while (x > 0) { string[dig - i] <- x %% 2L x <- x %/% 2L i <- i + 1L } string } 

如果你想要一个列表,像这样使用lapply

 lapply(0:(2^14 - 1), function(x) MyIntToBit(x,14)) 

如果你喜欢matrix, sapply会做的:

 sapply(0:(2^14 - 1), function(x) MyIntToBit(x,14)) 

以下是示例输出:

 > lapply(0:(2^3 - 1), function(x) MyIntToBit(x,3)) [[1]] [1] 0 0 0 [[2]] [1] 0 0 1 [[3]] [1] 0 1 0 [[4]] [1] 0 1 1 [[5]] [1] 1 0 0 [[6]] [1] 1 0 1 [[7]] [1] 1 1 0 [[8]] [1] 1 1 1 > sapply(0:(2^3 - 1), function(x) MyIntToBit(x,3)) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [1,] 0 0 0 0 1 1 1 1 [2,] 0 0 1 1 0 0 1 1 [3,] 0 1 0 1 0 1 0 1