给定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
,我可以将其减少为二进制值矩阵,因此限制解决二元变量的这个问题就足够了。
答案 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”是位置。如果您需要代码,则必须首先提供编码示例案例。