Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Following recursive logic allows you to calculate all combinations without repetitions and without the need to calculate all of them first. It works pretty nice, as long as choose(nx-1,ning-1) returns an integer. If it doesn't, calculating the possibilities is a bit ridiculous.</p> <p>It's a recursive process, so it might take long and it will cause memory trouble when your vectors exceed a certain limit. But then again, dividing a set of 14 elements in 7 groups gives already 135135 unique possibilities. Things get out of hand pretty quick in these kind of things.</p> <p>The logic in pseudo-something (wouldn't call it pseudocode)</p> <pre><code>nb = number of groups ning = number of elements in every group if(nb == 2) 1. take first element, and add it to every possible combination of ning-1 elements of x[-1] 2. make the difference for each group defined in step 1 and x to get the related second group 3. combine the groups from step 2 with the related groups from step 1 if(nb &gt; 2) 1. take first element, and add it to every possible combination of ning-1 elements of x[-1] 2. to define the other groups belonging to the first groups obtained like this, apply the algorithm on the other elements of x, but for nb-1 groups 3. combine all possible other groups from step 2 with the related first groups from step 1 </code></pre> <p>Translating this to R gives us :</p> <pre><code>perm.groups &lt;- function(x,n){ nx &lt;- length(x) ning &lt;- nx/n group1 &lt;- rbind( matrix(rep(x[1],choose(nx-1,ning-1)),nrow=1), combn(x[-1],ning-1) ) ng &lt;- ncol(group1) if(n &gt; 2){ out &lt;- vector('list',ng) for(i in seq_len(ng)){ other &lt;- perm.groups(setdiff(x,group1[,i]),n=n-1) out[[i]] &lt;- lapply(seq_along(other), function(j) cbind(group1[,i],other[[j]]) ) } out &lt;- unlist(out,recursive=FALSE) } else { other &lt;- lapply(seq_len(ng),function(i) matrix(setdiff(x,group1[,i]),ncol=1) ) out &lt;- lapply(seq_len(ng), function(i) cbind(group1[,i],other[[i]]) ) } out } </code></pre> <p>To show it works :</p> <pre><code>&gt; perm.groups(1:6,3) [[1]] [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 [[2]] [,1] [,2] [,3] [1,] 1 3 4 [2,] 2 5 6 [[3]] [,1] [,2] [,3] [1,] 1 3 4 [2,] 2 6 5 [[4]] [,1] [,2] [,3] [1,] 1 2 5 [2,] 3 4 6 [[5]] [,1] [,2] [,3] [1,] 1 2 4 [2,] 3 5 6 [[6]] [,1] [,2] [,3] [1,] 1 2 4 [2,] 3 6 5 [[7]] [,1] [,2] [,3] [1,] 1 2 5 [2,] 4 3 6 [[8]] [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [[9]] [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 6 5 [[10]] [,1] [,2] [,3] [1,] 1 2 4 [2,] 5 3 6 [[11]] [,1] [,2] [,3] [1,] 1 2 3 [2,] 5 4 6 [[12]] [,1] [,2] [,3] [1,] 1 2 3 [2,] 5 6 4 [[13]] [,1] [,2] [,3] [1,] 1 2 4 [2,] 6 3 5 [[14]] [,1] [,2] [,3] [1,] 1 2 3 [2,] 6 4 5 [[15]] [,1] [,2] [,3] [1,] 1 2 3 [2,] 6 5 4 </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload