2015-02-23 57 views
0

我想爲統計分析做變量抽樣。我有10個變量,我想檢查其中5個可能的組合。但是,我只想要那些遵循某些規則的人。我只想要那些有1個或2個,3個或4個,5個或6個,7個或8個,9個或10個的換句話說,所有的組合給出5個二元選擇(32)。生成矩陣的組合規則,重複的二元選擇

任何想法如何有效地做到這一點?

一個簡單的想法是找到使用所有5出10:

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個1結束了這些僅保留的。

但肯定有比這更有效的方法。

回答

3

這將構建一個矩陣,其32行枚舉所有滿足您的contraint可能的組合:

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 
1

我找到了一個解決方案太多,但它並不像約什 - 奧布萊恩的上述優雅。

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 
} 
+0

只是一個旁註:因爲你知道從一開始你的結果的「長度」,它應該是一個很多更快地預先分配你的「集合」和「變數」。例如。比較這些:'x_full = numeric(1e5); x_empty = numeric(); system.time(for(i in 1:1e5)x_full [i] = i); system.time(for(i in 1:1e5)x_empty = c(x_empty,i));相同(x_full,x_empty)' – 2015-02-23 21:44:28

0

根據您的答案的想法,備案一種替代方案:

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)