生成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