Ответ 1
Вы ищете expand.grid
.
expand.grid(0:1, 0:1, 0:1)
Или, для длинного случая:
n <- 14
l <- rep(list(0:1), n)
expand.grid(l)
Я пытаюсь создать все возможные комбинации 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)
Любая помощь будет оценена!
Спасибо,
Вы ищете expand.grid
.
expand.grid(0:1, 0:1, 0:1)
Или, для длинного случая:
n <- 14
l <- rep(list(0:1), n)
expand.grid(l)
В качестве альтернативы подходу @Justin вы также можете использовать 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
Есть 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
ниже), наряду с вашим выбором функций 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