Я хочу сформировать!перестановки для данного п в R - PullRequest
4 голосов
/ 05 июля 2010

предположим, что n = 3 тогда выходные данные должны быть: вектор, содержащий векторы: 123 213 132 231 321

Ответы [ 6 ]

6 голосов
/ 05 июля 2010
library(gtools)
permutations(3,3)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1    3    2
[3,]    2    1    3
[4,]    2    3    1
[5,]    3    1    2
[6,]    3    2    1
6 голосов
/ 05 июля 2010

Это решит ваш вопрос:

install.packages("combinat")
require(combinat)
permn(1:3)

Также функции: выбирать, комбинировать, расширять. Сетка Может пригодиться вам в будущем.

1 голос
/ 05 июля 2010

Пакет gregmisc должен иметь функцию permutations().

permutations3,3)
0 голосов
/ 25 ноября 2013

Некоторое время назад я должен был сделать это в базе R без загрузки каких-либо пакетов:

permutations <- function(n){
    if(n==1){
        return(matrix(1))
    } else {
        sp <- permutations(n-1)
        p <- nrow(sp)
        A <- matrix(nrow=n*p,ncol=n)
        for(i in 1:n){
            A[(i-1)*p+1:p,] <- cbind(i,sp+(sp>=i))
        }
        return(A)
    }
}

Пример:

> permutations(3)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    1    3    2
[3,]    2    1    3
[4,]    2    3    1
[5,]    3    1    2
[6,]    3    2    1
0 голосов
/ 05 июля 2010

Не знаю, так ли это, но я попробую.
Если вы хотите сделать что-то с огромным количеством перестановок чуть более длинных векторов, гораздо менее требовательным и примерно таким же хорошим является использование Монте-Карло и просто выборка пространства с большим количеством случайных перестановок (которые могут быть сгенерированы в R с функцией sample).

0 голосов
/ 05 июля 2010

Вот некоторый нерекурсивный код для этого:

maxdepth <- 4
curdepth <- 1
l <- list()
i <- 0
while (i < maxdepth) {
    l <- c(l, 1)
    i <- i+1
}
done <- 0
results <- list()
resct <- 1

print(paste(sep=",",l))

while (curdepth > 0) {
    if (curdepth == maxdepth) {
        results[[resct]] <- l
        resct <- resct+1
        l[[curdepth]] <- l[[curdepth]]+1
    }
    if (l[[curdepth]] == maxdepth+1) {
        while (!done && l[[curdepth]] == maxdepth+1) {
            l[[curdepth]] <- 1
            curdepth <- curdepth-1
            if (curdepth == 0) {
                done <- 1
            }
        }
        if (!done) {
            l[[curdepth]] <- l[[curdepth]]+1
        }
    } else if (curdepth < maxdepth) {
        curdepth <- curdepth+1
    }
}

edit: для вывода вектора вместо печати; после этого «результаты» должны содержать желаемый ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...