[R] combinatorial programming problem

Spencer Graves spencer.graves at pdf.com
Mon May 29 01:21:53 CEST 2006


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

	  I found this just now using 'RSiteSearch("all subsets of a size")', 
which produced 102 hits.  Another one that looked like it might help you 
is "http://finzi.psych.upenn.edu/R/Rhelp02a/archive/1717.html".

	  Hope this helps,
	  Spencer Graves

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[1]
>       k <- dims[2]
>       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]==1) {
>           return( indx(inds[-1]-1, k-1 ) ) } else {
>           return( indx(c(inds[1]-1, seq(from=k-r+2, by=1, to=k)), k) +
>                   indx( inds[-1]-inds[1], k-inds[1] ))
>           }
>     }
>    } # end indx
> 
> # Methods for assignment and indexing:
> 
> "[.symarray" <- function(x, inds, drop=FALSE){
>          dims <- attr(x, "dims")
>          k <- dims[2]
>          inds <- indx(inds, k)
>          res <- NextMethod("[", x)
>          res
> }
> 
> "[<-.symarray" <- function(x, inds, value){
>      dims <- attr(x, "dims")
>      k <- dims[2]
>      inds <- indx(inds, k)
>      res <- NextMethod("[<-", x)
>      res
> }
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html



More information about the R-help mailing list