# Re: [R] combinatorial programming problem

From: Martin Maechler <maechler_at_stat.math.ethz.ch>
Date: Mon 29 May 2006 - 19:02:44 EST

>>>>> "SpG" == Spencer Graves <spencer.graves@pdf.com> >>>>> on Sun, 28 May 2006 16:21:53 -0700 writes:

```    SpG> 	  I'm not sure I understand your question, but
SpG> are you asking how to index choose(k, r) objects?
SpG> Almost 3 years ago, I asked a question like this.  Andy
SpG> Liaw referred me to nchoosek(vsn)
SpG> (http://finzi.psych.upenn.edu/R/Rhelp02a/archive/12518.html).
SpG> This produces a matrix of dimension (r, choose(k, r)).
SpG> With this matrix, you could convert an integer between
SpG> 1 and choose(k, r) into an r-vector by table look-up.
SpG> this does not seem appropriate for you.

```

Note that *if* the above is the answer,
I'd rather recommend to use combn() from package "combinat", since a (slightly improved) version of combn() has been part of R-devel (to become R 2.4.0 in October) for a while. Also, combn() from "combinat" precedes nchoosek() historically and is also faster.

Martin Maechler, ETH Zurich

```    SpG> 	  I found this just now using 'RSiteSearch("all
SpG> subsets of a size")', which produced 102 hits.  Another
SpG> "http://finzi.psych.upenn.edu/R/Rhelp02a/archive/1717.html".

SpG> 	  Hope this helps, Spencer Graves

```

SpG> Kjetil Brinchmann Halvorsen wrote:
>> Hola!
>>
>> I am programming a class (S3) "symarray" for storing the
>> results of functions symmetric in its k
>> arguments. Intended use is for association indices for
>> more than two variables, for instance coresistivity
>> against antibiotics.
>>
>> There is one programming problem I haven't solved, making
>> an inverse of the index function indx() --- se code
>> below. It could for instance return the original k
>> indexes in strictly increasing order, to make indx()
>> formally invertible.
>>
>> Any ideas?
>>
>> Kjetil
>>
>>
>> Code:
>>
>>
>> # Implementing an S3 class for symarrays with array rank
>> r for dimension # [k, k, ..., k] with k>=r repeated r
>> times. We do not store the diagonal.
>>
>> # Storage requirement is given by {r, k}= choose(k, r) #
>> where r=array rank, k=maximum index
>>
>> symarray <- function(data=NA, dims=c(1,1)){ r <- dims
>> k <- dims if(r > k) stop("symarray needs dimension
>> larger than array rank") len <- choose(k, r) out <-
>> data[1:len] attr(out, "dims") <- dims class(out) <-
>> "symarray" out }
>>
>> # Index calculation:
>>
>> indx <- function(inds, k){ r <- length(inds) if(r==1)
>> return(inds) else { if(inds==1) { return(
>> indx(inds[-1]-1, k-1 ) ) } else { return(
>> indx(c(inds-1, seq(from=k-r+2, by=1, to=k)), k) +
>> indx( inds[-1]-inds, k-inds )) } } } # end indx
>>
>> # Methods for assignment and indexing:
>>
>> "[.symarray" <- function(x, inds, drop=FALSE){ dims <-
>> attr(x, "dims") k <- dims inds <- indx(inds, k) res <-
>> NextMethod("[", x) res }
>>
>> "[<-.symarray" <- function(x, inds, value){ dims <-
>> attr(x, "dims") k <- dims inds <- indx(inds, k) res <-
>> NextMethod("[<-", x) res }
>>
>> ______________________________________________
>> R-help@stat.math.ethz.ch mailing list
>> http://www.R-project.org/posting-guide.html

```    SpG> ______________________________________________
SpG> R-help@stat.math.ethz.ch mailing list