R:返回n个元素的所有可能顺序的函数?
在R中,是否有一个函数返回n个元素的所有可能顺序? 我想要一个n!通过n矩阵,使得每行包含n个元素的所有可能排序索引。也就是说,如果n=3,我想要:R:返回n个元素的所有可能顺序的函数?,r,combinations,combinatorics,R,Combinations,Combinatorics,在R中,是否有一个函数返回n个元素的所有可能顺序? 我想要一个n!通过n矩阵,使得每行包含n个元素的所有可能排序索引。也就是说,如果n=3,我想要: 1,2,3 1,3,2, 2,1,3, 2,3,1, 3,1,2, 3,2,1 我首先想到expand.grid可以完成这项工作,然后尝试: n <- 3 expand.grid(rep(list(1:n),n)) Var1 Var2 Var3 1 1 1 1 2 2 1 1 3
1,2,3
1,3,2,
2,1,3,
2,3,1,
3,1,2,
3,2,1
我首先想到expand.grid可以完成这项工作,然后尝试:
n <- 3
expand.grid(rep(list(1:n),n))
Var1 Var2 Var3
1 1 1 1
2 2 1 1
3 3 1 1
4 1 2 1
5 2 2 1
6 3 2 1
7 1 3 1
8 2 3 1
9 3 3 1
10 1 1 2
11 2 1 2
12 3 1 2
13 1 2 2
14 2 2 2
15 3 2 2
16 1 3 2
17 2 3 2
18 3 3 2
19 1 1 3
20 2 1 3
21 3 1 3
22 1 2 3
23 2 2 3
24 3 2 3
25 1 3 3
26 2 3 3
27 3 3 3
n试试看
用于此的另一个软件包,combinat
,其中permn
返回一个列表
,可以使用以下命令转换为矩阵
:
library(combinat)
t(simplify2array(permn(1:3)))
# [,1] [,2] [,3]
#[1,] 1 2 3
#[2,] 1 3 2
#[3,] 3 1 2
#[4,] 3 2 1
#[5,] 2 3 1
#[6,] 2 1 3
以下是一些选项:
n = 3
library(gtools)
permutations(n,n)
library(combinat)
permn(1:n)
library(multicool)
m = initMC(1:n)
allPerm(m)
library(iterpc)
I = iterpc(n, ordered = TRUE)
getall(I)
让我们做一些基准测试
n=5
I = iterpc(n, ordered = TRUE)
m=initMC(1:n)
library(microbenchmark)
microbenchmark( permutations(n,n), permn(1:n), allPerm(m), getall(I) )
# Unit: microseconds
# expr min lq median uq max neval
# permutations(n, n) 2781.110 2857.9100 2922.7635 2973.5835 4877.656 100
# permn(1:n) 3600.310 3664.0255 3722.6210 3772.4940 5475.748 100
# allPerm(m) 325.026 458.1460 503.6575 558.8390 719.835 100
# getall(I) 169.151 189.0615 245.5715 284.8245 472.937 100
来自gtools
的permutation
和来自cobinat
的permn
用R编写,而其他两个用C编写,因此速度要快得多。
此外,multicool
提供了一种专门为多集合置换设计的算法。因此,对于简单排列而言,iterpc
似乎是一个更好的选择:
f1 <- function(n){
m=initMC(1:n)
allPerm(m)}
f2 <- function(n){
I = iterpc(n, ordered = TRUE)
getall(I)}
microbenchmark(f1(10),f2(10))
# Unit: milliseconds
# expr min lq median uq max neval
# f1(10) 1143.8057 1216.4617 1322.2973 1335.5547 1383.8723 100
# f2(10) 421.7535 457.3466 461.4995 551.4025 648.8821 100
f1或do.call(rbind,perm(1:3))
这是iterpc的作者。实际上,iterpc还能够处理多集。:)
f1 <- function(n){
m=initMC(1:n)
allPerm(m)}
f2 <- function(n){
I = iterpc(n, ordered = TRUE)
getall(I)}
microbenchmark(f1(10),f2(10))
# Unit: milliseconds
# expr min lq median uq max neval
# f1(10) 1143.8057 1216.4617 1322.2973 1335.5547 1383.8723 100
# f2(10) 421.7535 457.3466 461.4995 551.4025 648.8821 100