生成具有规则的组合矩阵,重复二元选择

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)