[R] A question to get all possible combinations

(Ted Harding) ted.harding at wlandres.net
Wed Dec 22 23:39:05 CET 2010


On 22-Dec-10 18:19:38, Ron Michael wrote:
> Let say, I have a matrix with 8 rows and 6 columns:_
> df1 <- matrix(NA, 8, 4)
> df1
>      [,1] [,2] [,3] [,4]
> [1,]   NA   NA   NA   NA
> [2,]   NA   NA   NA   NA
> [3,]   NA   NA   NA   NA
> [4,]   NA   NA   NA   NA
> [5,]   NA   NA   NA   NA
> [6,]   NA   NA   NA   NA
> [7,]   NA   NA   NA   NA
> [8,]   NA   NA   NA   NA
> 
> Now I want to get **all possible** ways to fetch 6 cells at
> a time. Is there any function to do that?
> Thanks,

If you just want all possible sets of 6 values (i.e. the values
at 6 different cells, for all possible choices of 6 out of 8*4 = 32)
then it is straightforward enough using the combn() function.
I give a smaller example to show the principle. You get the 20 ways
of choosing the values in 3 different cells of a 6-cell (3*2) matrix:

  df1 <- matrix((1:6),ncol=2)
  df1
  #      [,1] [,2]
  # [1,]    1    4
  # [2,]    2    5
  # [3,]    3    6

  combn(df1,3)
      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9] [,10]
[1,]     1     1     1     1     1     1     1     1     1     1
[2,]     2     2     2     2     3     3     3     4     4     5
[3,]     3     4     5     6     4     5     6     5     6     6
     [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
[1,]     2     2     2     2     2     2     3     3     3     4
[2,]     3     3     3     4     4     5     4     4     5     5
[3,]     4     5     6     5     6     6     5     6     6     6

This basically works because the elements of a matrix are stored
linearly (1->2->3->4->5->6) down the columns, with a "dim" attribute
to sort out the indexing by rows and columns. combn(df1,3) then
picks out all sets of 3 from these 6 and returns the results in
"natural" order.

However, this result loses all information about the row-column
indexing of the values which are returned. 

Getting at this is a little trickier. There may be some function
which can do it directly, though I don't know of one. An alternative
(the least subtle I can think of ... ) could be to do the same combn()
operation on vectors which gives the rows and columns of the elements
in the matrix df1:

The result of combn() is a list, as above, and you can make it a
linear vector with:

  as.vector(combn(df1,3))
  #  [1] 1 2 3 1 2 4 1 2 5 1 2 6 1 3 4 1 3 5 1 3 6 1 4 5 1 4 6 1 5 6
    [16] 2 3 4 2 3 5 2 3 6 2 4 5 2 4 6 2 5 6 3 4 5 3 4 6 3 5 6 4 5 6

Now you can do the same with the columns of a matrix which carries
the row indices and the column indices:

  RC <- cbind(Row=rep(c(1,2,3),2),Col=rep(c(1,2),each=3))
  RC
  #      Row Col
  # [1,]   1   1
  # [2,]   2   1
  # [3,]   3   1
  # [4,]   1   2
  # [5,]   2   2
  # [6,]   3   2

Now:
  df1.3 <- as.vector(combn(df1,3))
  ix.RC <- combn((1:nrow(RC)),3)
  All   <- cbind(RC[ix.RC,],df1.3)
  colnames(All) <- c("Row","Col","Val")
  All
  #       Row Col   Val
  #  [1,]   1   1     1
  #  [2,]   2   1     2
  #  [3,]   3   1     3
  #  [4,]   1   1     1
  #  [5,]   2   1     2
  #  [6,]   1   2     4
  #  [7,]   1   1     1
  #  [8,]   2   1     2
  #  [9,]   2   2     5
  # [10,]   1   1     1
  # [11,]   2   1     2
  # [12,]   3   2     6
  # .................
  # [49,]   3   1     3
  # [50,]   1   2     4
  # [51,]   2   2     5
  # [52,]   3   1     3
  # [53,]   1   2     4
  # [54,]   3   2     6
  # [55,]   3   1     3
  # [56,]   2   2     5
  # [57,]   3   2     6
  # [58,]   1   2     4
  # [59,]   2   2     5
  # [60,]   3   2     6

in which each block of 3 successive rows gives you the 3 Rows,
the 3 Columns, and the 3 Values for one of the 20 possible
choices of 3 cells out of the 6 in the matrix. You could
subsequently rearrange this to suit your purposes.

Ted.

--------------------------------------------------------------------
E-Mail: (Ted Harding) <ted.harding at wlandres.net>
Fax-to-email: +44 (0)870 094 0861
Date: 22-Dec-10                                       Time: 22:39:03
------------------------------ XFMail ------------------------------



More information about the R-help mailing list