生成具有规则的组合矩阵,重复二元选择
Generate matrix of combinations with rules, repeated binary choice
我正在尝试对变量进行抽样以进行统计分析。我有 10 个变量,我想检查其中 5 个变量的所有可能组合。但是,我只想要那些遵循特定规则的。我只想要那些具有 1 xor 2、3 xor 4、5 xor 6、7 xor 8 和 9 xor 10 的组合。换句话说,所有组合都给出了 5 个二元选择 (32)。
知道如何有效地做到这一点吗?
一个简单的想法是使用以下方法找出 10 个中的所有 5 个:
library(gtools)
sets = combinations(10,5) # choose 5 out of 10, all possibilities
sets = split(sets, seq.int(nrow(sets))) #so it's loopable
然后遍历这些只保留符合条件的那些,从而得到所需的 32 个。
但肯定有比这更有效的方法。
这将构造一个矩阵,其 32 行列举了满足您的约束的所有可能组合:
m <- as.matrix(expand.grid(1:2, 3:4, 5:6, 7:8, 9:10))
## Inspect a few of the rows to see that this works:
m[c(1,4,9,16,25),]
# Var1 Var2 Var3 Var4 Var5
# [1,] 1 3 5 7 9
# [2,] 2 4 5 7 9
# [3,] 1 3 5 8 9
# [4,] 2 4 6 8 9
# [5,] 1 3 5 8 10
我也找到了一个解决方案,但它不像上面 Josh O'Brien 的那样优雅。
library(R.utils) #for intToBin()
binaries = intToBin(0:31) #binary numbers 0 to 31
sets = list() #empty list
for (set in binaries) { #loop over each binary number string
vars = numeric() #empty vector
for (cif in 1:5) { #loop over each char in the string
if (substr(set,cif,cif)=="0"){ #if its 0
vars = c(vars,cif*2-1) #add the first var
}
else {
vars = c(vars,cif*2) #else, add the second var
}
}
sets[[set]] = as.vector(vars) #add result to list
}
根据您回答中的想法,记录备选方案:
n = 5
sets = matrix(1:10, ncol = 2, byrow = TRUE)
#the "on-off" combinations for each position
combs = lapply(0:(2^n - 1), function(x) as.integer(intToBits(x)[seq_len(n)]))
#a way to get the actual values
matrix(sets[cbind(seq_len(n), unlist(combs) + 1L)], ncol = n, byrow = TRUE)
我正在尝试对变量进行抽样以进行统计分析。我有 10 个变量,我想检查其中 5 个变量的所有可能组合。但是,我只想要那些遵循特定规则的。我只想要那些具有 1 xor 2、3 xor 4、5 xor 6、7 xor 8 和 9 xor 10 的组合。换句话说,所有组合都给出了 5 个二元选择 (32)。
知道如何有效地做到这一点吗?
一个简单的想法是使用以下方法找出 10 个中的所有 5 个:
library(gtools)
sets = combinations(10,5) # choose 5 out of 10, all possibilities
sets = split(sets, seq.int(nrow(sets))) #so it's loopable
然后遍历这些只保留符合条件的那些,从而得到所需的 32 个。
但肯定有比这更有效的方法。
这将构造一个矩阵,其 32 行列举了满足您的约束的所有可能组合:
m <- as.matrix(expand.grid(1:2, 3:4, 5:6, 7:8, 9:10))
## Inspect a few of the rows to see that this works:
m[c(1,4,9,16,25),]
# Var1 Var2 Var3 Var4 Var5
# [1,] 1 3 5 7 9
# [2,] 2 4 5 7 9
# [3,] 1 3 5 8 9
# [4,] 2 4 6 8 9
# [5,] 1 3 5 8 10
我也找到了一个解决方案,但它不像上面 Josh O'Brien 的那样优雅。
library(R.utils) #for intToBin()
binaries = intToBin(0:31) #binary numbers 0 to 31
sets = list() #empty list
for (set in binaries) { #loop over each binary number string
vars = numeric() #empty vector
for (cif in 1:5) { #loop over each char in the string
if (substr(set,cif,cif)=="0"){ #if its 0
vars = c(vars,cif*2-1) #add the first var
}
else {
vars = c(vars,cif*2) #else, add the second var
}
}
sets[[set]] = as.vector(vars) #add result to list
}
根据您回答中的想法,记录备选方案:
n = 5
sets = matrix(1:10, ncol = 2, byrow = TRUE)
#the "on-off" combinations for each position
combs = lapply(0:(2^n - 1), function(x) as.integer(intToBits(x)[seq_len(n)]))
#a way to get the actual values
matrix(sets[cbind(seq_len(n), unlist(combs) + 1L)], ncol = n, byrow = TRUE)