Generar una lista de todas las combinaciones posibles de elementos del vector

Intento generar todas las combinaciones posibles de 0 y 1 en un vector de longitud 14. ¿Hay una manera fácil de obtener esa salida como una lista de vectores, o mejor aún, un dataframe?

Para demostrar mejor lo que estoy buscando, supongamos que solo quiero un vector de longitud 3. Me gustaría poder generar lo siguiente:

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

¡Cualquier ayuda sería apreciada!

Gracias,

Está buscando expand.grid .

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

O, para el caso largo:

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

Como alternativa al enfoque de @ Justin, también puede usar CJ desde el paquete “data.table”. Aquí, también hice uso de replicate para crear mi lista de 14 ceros y unos.

 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 

Hay 16384 posibles permutaciones. Puede usar el paquete iterpc para obtener el resultado de forma iterativa.

 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 

Si quiere todos los resultados, puede usar getall(I) .

Como se trata de 0’s y 1’s, parece natural pensar en enteros en términos de bit. Usando una función que ha sido ligeramente alterada desde esta publicación ( MyIntToBit continuación), junto con su elección de funciones de apply , podemos obtener el resultado deseado.

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

Si desea una lista, use lapply así:

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

Si prefieres una matriz, sapply hará el truco:

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

A continuación se muestran ejemplos de resultados:

 > 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 

tidyr tiene un par de opciones similares a expand.grid() .

tidyr::crossing() devuelve un tibble y no convierte strings en factores (aunque podría hacer expand.grid(..., stringsAsFactors = F) ).

 library(tidyr) crossing(var1 = 0:1, var2 = 0:1, var3 = 0:1) # A tibble: 8 x 3 var1 var2 var3    1 0 0 0 2 0 0 1 3 0 1 0 4 0 1 1 5 1 0 0 6 1 0 1 7 1 1 0 8 1 1 1 

tidyr::expand() puede dar ambas combinaciones de valores únicos que aparecen en los datos, como este:

 expand(mtcars, nesting(vs, cyl)) # A tibble: 5 x 2 vs cyl   1 0 4 2 0 6 3 0 8 4 1 4 5 1 6 

o todas las combinaciones posibles de dos variables, incluso si no hay una observación con esos valores específicos en los datos en los datos, como esta:

 expand(mtcars, vs, col) # A tibble: 6 x 2 vs cyl   1 0 4 2 0 6 3 0 8 4 1 4 5 1 6 6 1 8 

(Puede ver que no hubo observaciones en los datos originales donde vs == 1 & cyl == 8)

tidyr::complete() también se puede usar de forma similar a expand.grid() . Este es un ejemplo de los documentos:

 df <- dplyr::tibble( group = c(1:2, 1), item_id = c(1:2, 2), item_name = c("a", "b", "b"), value1 = 1:3, value2 = 4:6 ) df %>% complete(group, nesting(item_id, item_name)) # A tibble: 4 x 5 group item_id item_name value1 value2      1 1 1 a 1 4 2 1 2 b 3 6 3 2 1 a NA NA 4 2 2 b 2 5 

Esto proporciona todas las combinaciones posibles de item_id y item_name para cada grupo; crea una línea para el grupo 2 item_id 1 y item_name a.