Erich- This approach would be great for my context. However, in the code below I do not see how to restrict the output to the set of combinations I am looking for. For example, suppose I am looking for the 10 two element combinations of 1:5. Can you give me some psuedocode that shows how to do this? After putting the code below in a loop I do not see how to restrict the output to containing only numbers from 1:5. thanks very much.
________________________________ From: Erich Neuwirth <erich.neuwi...@univie.ac.at> Cc: David Winsemius <dwinsem...@comcast.net>; r-help@r-project.org Sent: Wed, March 3, 2010 2:10:34 PM Subject: Re: [R] Working with combinations The following code takes a combination of type n over k represented by an increasing sequence as input an produces the lexicographically next combinations. So you can single step through all possible combinations and apply your filter criteria before you produce the next combination. next.combin <- function(oldcomb,n){ lcomb <- length(oldcomb) hole.pos <- last.hole.pos(oldcomb,n) if ((hole.pos == lcomb) & oldcomb[lcomb]==n) { return(NA) } newcomb<-oldcomb newcomb[hole.pos]<-oldcomb[hole.pos]+1 return(newcomb) } last.hole.pos <- function(comb,n){ lcomb <- length(comb) diffs <- comb[-1]-comb[-lcomb] if (max(diffs)==1) { return(lcomb) } diffpos <- which(diffs>1) return(diffpos[length(diffpos)]) } On Mar 3, 2010, at 7:35 PM, Herm Walsh wrote: Thanks David for the thoughts. The challenge I have with this approach is that the criteria I have is defined by a series of tests--which I do not think I could substitute in in place of the logical indexing. > >In the combinations code I was hoping there is a step where, each new >combination is added to the current list of combinations. If this were the >case, I could put my series of tests in the code right there and then store >the combination if appropriate. > >However, evalutating the code--which uses recursion--I am not sure if this >approach will work. The combinations code is listed below. Is there a simple >place(s) where I could insert my tests, operating on the current combination? > >function (n, r, v = 1:n, set = TRUE, repeats.allowed = FALSE) >{ > if (mode(n) != "numeric" || length(n) != 1 || n < 1 || (n%%1) != > 0) > stop("bad value of n") > if (mode(r) != "numeric" || length(r) != 1 || r < 1 || (r%%1) != > 0) > stop("bad value of r") > if (!is.atomic(v) || length(v) < n) > stop("v is either non-atomic or too short") > if ((r > n) & repeats.allowed == FALSE) > stop("r > n and repeats.allowed=FALSE") > if (set) { > v <- unique(sort(v)) > if (length(v) < n) > stop("too few different elements") > } > v0 <- vector(mode(v), 0) > if (repeats.allowed) > sub <- function(n, r, v) { > if (r == 0) > v0 > else if (r == 1) > matrix(v, n, 1) > else if (n == 1) > matrix(v, 1, r) > else rbind(cbind(v[1], Recall(n, r - 1, v)), Recall(n - > 1, r, v[-1])) > } > else sub <- function(n, r, v) { > if (r == 0) > v0 > else if (r == 1) > matrix(v, n, 1) > else if (r == n) > matrix(v, 1, n) > else rbind(cbind(v[1], Recall(n - 1, r - 1, v[-1])), > Recall(n - 1, r, v[-1])) > } > sub(n, r, v[1:n]) >} ><environment: namespace:gtools> > > > >************************************************************************************************************************************************************** > > >I am working with the combinations function (available in the gtools >package). However, rather than store all of the possible combinations I would >like to check each combination to see if it meets a certain criteria. If it >does, I will then store it. >> > >> >I have looked at the combinations code but am unsure where in the algorithm I >would be able to operate on each combination. >> >Logical indexing: > > >combinations(3,2,letters[1:3])[,1]=="a" >>[1] TRUE TRUE FALSE > > >combinations(3,2,letters[1:3])[ combinations(3,2,letters[1:3])[,1]=="a", ] >> [,1] [,2] >[1,] "a" "b" >[2,] "a" "c" > >--David > > > > >[[alternative HTML version deleted]] > >______________________________________________ >R-help@r-project.org mailing list >https://stat.ethz.ch/mailman/listinfo/r-help >PLEASE do read the posting guide http://www.R-project.org/posting-guide.html >and provide commented, minimal, self-contained, reproducible code. > -- Erich Neuwirth Didactic Center for Computer Science and Institute for Scientific Computing University of Vienna [[alternative HTML version deleted]]
______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.