60

たとえば、次のように、リストの順列のリストを作成しようとしていperms(list("a", "b", "c"))ます

list(list("a", "b", "c"), list("a", "c", "b"), list("b", "a", "c"),
     list("b", "c", "a"), list("c", "a", "b"), list("c", "b", "a"))

どのように進めればよいかわかりません。どんな助けでも大歓迎です。

4

13 に答える 13

57

combinat::permnその仕事をします:

> library(combinat)
> permn(letters[1:3])
[[1]]
[1] "a" "b" "c"

[[2]]
[1] "a" "c" "b"

[[3]]
[1] "c" "a" "b"

[[4]]
[1] "c" "b" "a"

[[5]]
[1] "b" "c" "a"

[[6]]
[1] "b" "a" "c"

要素が大きいと計算が膨大になるので注意。

于 2012-06-19T07:13:16.047 に答える
36

base R も答えを提供できます。

all <- expand.grid(p1 = letters[1:3], p2 = letters[1:3], p3 = letters[1:3], stringsAsFactors = FALSE) 
perms <- all[apply(all, 1, function(x) {length(unique(x)) == 3}),]
于 2013-08-06T10:08:25.040 に答える
35

permutations()パッケージから試すことができますが、 fromgtoolsとは異なり、リストを出力しません:permn()combinat

> library(gtools)
> permutations(3, 3, letters[1:3])
     [,1] [,2] [,3]
[1,] "a"  "b"  "c" 
[2,] "a"  "c"  "b" 
[3,] "b"  "a"  "c" 
[4,] "b"  "c"  "a" 
[5,] "c"  "a"  "b" 
[6,] "c"  "b"  "a" 
于 2012-06-19T07:24:36.873 に答える
18

ベース R のソリューション、他のパッケージへの依存関係なし:

> getPerms <- function(x) {
    if (length(x) == 1) {
        return(x)
    }
    else {
        res <- matrix(nrow = 0, ncol = length(x))
        for (i in seq_along(x)) {
            res <- rbind(res, cbind(x[i], Recall(x[-i])))
        }
        return(res)
    }
}

> getPerms(letters[1:3])
     [,1] [,2] [,3]
[1,] "a"  "b"  "c" 
[2,] "a"  "c"  "b" 
[3,] "b"  "a"  "c" 
[4,] "b"  "c"  "a" 
[5,] "c"  "a"  "b" 
[6,] "c"  "b"  "a"

これが役立つことを願っています。

于 2015-12-15T11:03:44.700 に答える
11

試す:

> a = letters[1:3]
> eg = expand.grid(a,a,a)
> eg[!(eg$Var1==eg$Var2 | eg$Var2==eg$Var3 | eg$Var1==eg$Var3),]
   Var1 Var2 Var3
6     c    b    a
8     b    c    a
12    c    a    b
16    a    c    b
20    b    a    c
22    a    b    c

コメントで @Adrian が示唆しているように、最後の行は次のように置き換えることができます。

eg[apply(eg, 1, anyDuplicated) == 0, ]
于 2014-09-18T04:25:10.457 に答える