4

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

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

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

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

4

4 回答 4

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
于 2013-01-10T16:37:01.667 回答
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 
于 2013-01-10T17:02:39.173 回答
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

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

于 2013-01-10T17:07:21.103 回答
0

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

于 2013-01-10T16:34:59.987 回答