在R中生成可能排列的随机,非重复子集

时间:2013-01-10 15:58:31

标签: r permutation

给定p个离散变量,我想随机选择k个可能的排列。 换句话说,对于a中的变量{0,1}b中的{1,2,3},两个随机排列将是 [0,2][1,3]

我想在没有首先生成所有可能排列的表的情况下生成这些,因为这样做会变得很麻烦,因为变量的数量和它们可以采用的值会增加。问题是,我想这样做而不重复。我发现的代码here非常接近:

x <- sample.int (2, m*n, TRUE)-1L
dim(x) <- c(m,n) 

我意识到对于values > 2,我可以将其减少为二进制值矩阵,因此限制解决二元变量的这个问题就足够了。

4 个答案:

答案 0 :(得分:1)

我知道你说你不想做所有可能的排列,但实际上并不是那么麻烦。只需使用expand.grid()并从结果中取样即可。例如:

a <- c(0,1)
b <- c(1,2,3)
combinations <- expand.grid(a,b)

k <- 2
combinations[sample(nrow(combinations),k),]

这将产生

  Var1 Var2
2    1    1
5    0    3

答案 1 :(得分:1)

这可以满足您的需求。它将采用每个变量的排列而不是整体。这在技术上是相同的,但我相信它会加快速度。

a <- 1:100
b <- 1:100
c <- 1:100

yourdatamatrix <- cbind(a, b, c)

现在我们有了一些数据,这里有功能:

PermutationFunction <- function (data, k) {

  # creating matrix: amount of variables * amount of permutations
  permutations <- matrix(1:(k * length(data[1,])), nrow=k) 
  row <- NULL

  # Output will have as many columns as there are variables.
  for (i in 1:length(data[1,])) {
   permutations[ ,i] <- sample(data[ , i], k, replace=FALSE)
  }
  permutations
}

PermutationFunction(yourdatamatrix, k = 10)

时间检查(40个变量,每个值10000个值,取5000个):

system.time(PermutationFunction(yourdatamatrix, 5000))

> system.time(PermutationFunction(yourdatamatrix, 5000))
   user  system elapsed 
   0.05    0.00    0.05 

答案 2 :(得分:1)

以下是对答案的尝试:

首先,将k设置为您要生成的组合数

k <- 6

# Store your "p discrete variables" as a list (in this case I've arbitrarily made 4)

variables <- list(a = 1:5, b = 3:12, c = 5:14, d = 7:20)

# Generate a matrix with combinations as rows and each column corresponding to a variable

combinations <- matrix( sapply(variables, sample, 1), 
                        ncol = length(variables), 
                        dimnames = list( NULL , names(variables))

                        )

# Compute combinations until you have generated k that are unique

while(nrow(combinations) < k){

comb.new <- sapply(variables, sample, 1)

combinations <- unique(rbind(combinations, comb.new))

}

rownames(combinations) <- NULL

我知道它不是很漂亮,但似乎有效!它还具有不要求离散变量具有相同长度的优点,并且计算独特的组合,而不是仅从每个变量中选择唯一元素。

答案 3 :(得分:0)

(同意Kolassa对您的术语的批评。)如果问题仅限于每组中最多16个,那么您可以将每个样本保存为单个4字节整数(就像即将到来的R之前的所有R版本一样) 3.0已完成)第一个选择为最低2个字节的位,第二个选择为高位2个字节。你会加上2 ^ index [i],其中“index”是位置。如果您需要代码,则必须首先提供编码示例案例。