我在R中有一个50个数字的向量,我正在使用这个向量生成这个向量的排列,sample()
但我的问题是:
从这个向量不重复可以生成的组合总数是多少?
并且 sample 是否计算排列而不重复?
我正在做的是这样的:
for (i in 1:100)
{
test$x <- sample(test$x,nrow(test), replace=FALSE)
}
有没有可能我可以从 x 列的这段代码中得到重复的排列?
我在R中有一个50个数字的向量,我正在使用这个向量生成这个向量的排列,sample()
但我的问题是:
从这个向量不重复可以生成的组合总数是多少?
并且 sample 是否计算排列而不重复?
我正在做的是这样的:
for (i in 1:100)
{
test$x <- sample(test$x,nrow(test), replace=FALSE)
}
有没有可能我可以从 x 列的这段代码中得到重复的排列?
值的唯一排列数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"
sample(1:3)
。正如@djurhio 提到的,您的示例中的排列数为 50!(即 ca. 3e64)对于您来说太大而无法找到所有这些。但是,对于较小的样本,您可以使用allPerms
package中的函数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