2013-09-09 4 views
29

Я пытаюсь сгенерировать все возможные комбинации 0 и 1 в векторе длины 14. Есть ли простой способ получить этот вывод как список векторов, или даже лучше, 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) 

Любая помощь будет оценен по достоинству!

Спасибо,

ответ

53

Вы ищете expand.grid.

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

Или, для длинного случая:

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

expand.grid(l) 
+0

@Maria m Как это точно не соответствует вашим требованиям? – Dason

5

Есть 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).

6

В качестве альтернативы подходу Юстина вы также можете использовать CJ из пакета data.table. Здесь я также использовал replicate, чтобы создать список из 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 
+0

по сравнению с известной скоростью по сравнению с хорошо известным expand.grid – Barnaby

3

Поскольку вы имеете дело с 0 и 1, кажется естественным думать о целых числах в терминах бит. Используя функцию, которая была слегка изменена из этого post (MyIntToBit ниже), наряду с вашим выбором функций 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)) 

Если вы предпочитаете матрицу, 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 
Смежные вопросы