从样本中生成的组合总数

时间:2012-12-12 09:34:38

标签: r permutation

我在R中有一个50的数字向量,我使用sample()生成此向量的排列,但我的问题是:

可以从此向量生成的组合总数,而不重复?

并且样本是否计算排列而不重复?

我正在做的是这样的:

for (i in 1:100) 
{
    test$x <- sample(test$x,nrow(test), replace=FALSE)
}

是否有任何可能性,我可能会从此代码中获得x列的重复排列?

3 个答案:

答案 0 :(得分:1)

  1. 不同排列的数量应为50!在你的例子中。
  2. 按顺序生成样本并不能保证它们的唯一性。重复sample(1:3)
  3. ,尝试一个小例子
  4. 是的,您的示例中的排列可能会重复。

答案 1 :(得分:1)

n值的唯一排列数为n!。如果您有n = 3个值,则排列数为3 * 2 * 1 = 6。在R中,此数字可以使用factorial(n)计算。

函数sample的不同运行独立。因此,可以获得相同的排列。

如果要生成一组值的所有排列,可以使用permutations包中的函数gregmisc。这是一个例子:

# generate a vector of values  
dat <- letters[1:3] # [1] "a" "b" "c"

# the number of values to be drawn from the vector
n_samp <- 2 # Note. The maximum number is: length(dat)

library(gregmisc)

# generate the permutations
permutations(length(dat), n_samp, v = dat)

# The result:

    [,1] [,2]
[1,] "a"  "b" 
[2,] "a"  "c" 
[3,] "b"  "a" 
[4,] "b"  "c" 
[5,] "c"  "a" 
[6,] "c"  "b"

答案 2 :(得分:0)

由于@djurhio提到你的例子中的排列数为50! (即大约3e64)太大了,你无法找到所有这些。但是,对于较小的样本,您可以使用包allPerms中的函数permute

test<-data.frame(x=round(rnorm(5),2)
test
   x
1  0.33
2  0.34
3  2.18
4  0.92
5 -0.29
library(permute)
t(apply(allPerms(test$x),1,function(X)test$x[X]))
        [,1]  [,2]  [,3]  [,4]  [,5]
  [1,]  0.33  0.34  2.18 -0.29  0.92
  [2,]  0.33  0.34  0.92  2.18 -0.29
                    ...
[118,] -0.29  0.92  2.18  0.33  0.34
[119,] -0.29  0.92  2.18  0.34  0.33