2017-08-05 69 views
-1

我想弄清楚如何排除一些選定的組合後排除combn函數組合的數量。比方說,我們有一個向量c(「var1」,「var2」,「var3」,「var4」,「var5」),我想獲得這個元素的所有組合,除了這些元素的c(「 VAR4" , 「VAR5」)。下面是代碼:梳理返回梳的數量減少一些梳子在R

vector <- c("var1","var2","var3","var4","var5") 
exclude <- matrix(c("var4","var5"),1,2) 

for(i in 1:length(vector)){ 
    comb <- combn(vector,i) 
    for(j in 1:ncol(comb)){ 
    newcomb <- c(comb[,j]) 
    if (any(as.logical("FALSE"),apply(exclude, 1, function(x) all(x %in% newcomb)))) {next} 
     else {print(newcomb)}} 
} 

從combn函數返回組合的數量沒有任何減少31.土地被認爲是:

f <- function(nvars){ 
    a <- NULL 
    for (i in 1:nvars){ 
    a[i] <- choose(nvars,i)} 
    return(sum(a))} 
f(5) 

任何建議如何讓減少的組合數( 5個變量並排除同時包含「var4」和「var5」的組合,它應該是23)。謝謝!

回答

0

這將計算組合的數量對於任何輸入vectorexclude(它是根據你在問題環)...

sum(sapply(seq_along(vector),     #sum for all combination lengths... 
    function(i) sum(apply(combn(vector, i), 2, #...the sum for all combinations... 
     function(y) !any(apply(exclude, 1,  #...the value for each row of exclude... 
      function(x) all(x %in% y)))))))  #...whether combn doesn't contain exclude row 

[1] 71 #for the example you give 
+1

謝謝!這是我以後的一般解決方案。 – New2coding

+0

你認爲它的價值取代combn函數與一些更快的選擇?我只是想估計我的數據框(〜30列)的組合數量,並且需要很長時間才能返回結果。首先,我計算相關矩陣(即查找在給定級別相關的列),然後執行腳本。 – New2coding

+0

是的,如果你有很多列,數字會變得非常大。你可能需要重新思考你正在試圖用這個來實現。 –

-1

通過vector序列我們循環,通過指定的「m」作爲序列值獲得combn,然後檢查是否all的「排除」的元件是有%in%組合元件,否定(!unlistlist並獲得邏輯元素的sum

sum(unlist(lapply(seq_along(vector), function(i) combn(vector, i, 
     FUN = function(x) !all(c(exclude) %in% x))))) 
#[1] 23 
+0

n_combs < - 函數(){ 爲(I在1:長度(矢量)){ 梳< - combn(矢量,我) 爲(向量),函數(i)combn(向量,i, FUN =函數(x)!全部(c(排除) %的%X))))) }} 打印 (一) } n_combs() – New2coding

+0

這段代碼工作,但不是它可能通過其他方式得到相同的結果?通過使用這個代碼,需要等待直到嵌套循環內的所有組合都被創建.. – New2coding

+0

@ New2coding如果你需要'combn'輸出,那麼它必須經過這個 – akrun

-1

一個解決我的後:

f <- function(x,y){ 
    a <- NULL 
    for (i in 1:x){ 
    a[i] <- choose(x,i) - choose(x-y,i-y)} 
    return(sum(a))} 
f(5,2) 

@Andrew Gustar - 感謝您的建議!

我還需要找到矩陣,其中的變量被排除(其中一些是不同的,有些是不)更通用的解決方案:

vector <- c("var1","var2","var3","var4","var5","var6","var7","var8") 
exclude <- matrix(c(c("var3","var2"),c("var4","var3"),c("var5","var7")),3,2)). 
+0

'2^x - 2 ^(x-y) - 1'可能更快! –

+0

您是否認爲可以進一步修改,以便有更多的排除變量對(例如,排除< - 矩陣(c(c(「var3」,「var2」),c(「var4」,「var7」)),2,2))它仍然有效?謝謝! – New2coding

+0

排除兩個不同的y元素集合中至少一個元素的組合的數量大概爲2^x -2 * 2 ^(xy)+ 2 ^(x-2 * y)-1,三個不同的集合將是2 * x-3 * 2 ^(xy)+ 3 * 2 ^(x-2 * y)-2 ^(x-3 * y)-1'等等。如果這些集合不是獨立的(例如'var1,var2'和'var2,var3'),那麼它會變得更加複雜! –