Я быстро написал эту функцию для генерации всех N ^ K перестановок длины K для заданных N символов. Надеюсь, это будет полезно.
gen_perm <- function(str=c(""), lst=5, levels = c("0", "1", "2")){
if (nchar(str) == lst){
cat(str, "\n")
return(invisible(NULL))
}
for (i in levels){
gen_perm(str = paste0(str,i), lst=lst, levels=levels)
}
}
# sample call
gen_perm(lst = 3, levels = c("x", "T", "a"))
Я вернусь к вашей проблеме, когда у меня будет больше времени.
ОБНОВЛЕНИЕ Я изменил приведенный выше код, чтобы он работал для вашей проблемы. Обратите внимание, что заполняемая матрица живет в глобальной среде. Функция также использует переменную tmp
для передачи строк в глобальную среду. Для меня это был самый простой способ решить проблему. Возможно, есть и другие способы.
levels <- c(0,1)
nc <- 3
m <- matrix(numeric(0), ncol = nc)
gen_perm <- function(row=numeric(), lst=nc, levels = levels){
if (length(row) == lst){
assign("tmp", row, .GlobalEnv)
with(.GlobalEnv, {m <- rbind(m, tmp); rownames(m) <- NULL})
return(invisible(NULL))
}
for (i in levels){
gen_perm(row=c(row,i), lst=lst, levels=levels)
}
}
gen_perm(lst=nc, levels=levels)
ОБНОВЛЕНИЕ 2 Чтобы получить ожидаемый результат, который вы указали, запустите
m <- matrix(numeric(0), ncol = 3)
gen_perm(lst = 3, levels = c(0,1))
m
levels
, чтобы указать диапазон значенийгенерировать (двоичный в нашем случае) генерировать перестановки, m
- пустая матрица для заполнения, gen_perm
генерирует строки и добавляет их в матрицу m
, lst
- длина перестановки (соответствуетколичество столбцов в матрице).