[R] all possible subsets of r out of n
Ravi Varadhan
rvaradha at jhsph.edu
Wed Aug 28 21:51:10 CEST 2002
I had the same question a couple of years ago and here is the reply I got
from Tim Hesterberg of Insightful Corp. It should work in R.
Ravi.
----------------------------------------------------------------------------
--
I don't have that. But there is code to compute all combinations of
k integers out of n that you might adapt.
For a recursive version, see Venables & Ripley's subsets() function
(page 50 of their S Programming book).
A non-recursive version (harder to understand and extend, but faster
for larger n because it avoids recomputing quantities) is:
combinations _ function(n, k){
# Compute all n choose k combinations of size k from 1:n
# Return matrix with k rows and choose(n,k) columns.
# Avoids recursion.
if(!is.numeric(n) || length(n) != 1 || n%%1) stop("'n' must be an
integer")
if(!is.numeric(k) || length(k) != 1 || k%%1) stop("'k' must be an
integer")
if(k > n || k <= 0) return(numeric(0))
rowMatrix _ function(n) structure(1:n, dim=c(1,n))
colMatrix _ function(n) structure(1:n, dim=c(n,1))
if(k == n) return(colMatrix(n))
if(k == 1) return(rowMatrix(n))
L _ vector("list", k)
# L[[j]] will contain combinations(N, j) for N = 2:n
L[[1]] _ rowMatrix(2)
L[[2]] _ colMatrix(2)
Diff _ n-k
for(N in seq(3, n, by=1)){
# loop over j in reverse order, to avoid overwriting
for(j in seq(min(k, N-1), max(2, N-Diff), by= -1))
L[[j]] _ cbind(L[[j]], rbind(L[[j-1]], N, deparse.level=1))
if(N <= Diff+1) L[[1]] _ rowMatrix(N)
else L[[N-(Diff+1)]] _ numeric(0)
if(N <= k) L[[N]] _ colMatrix(N)
}
L[[k]]
}
----- Original Message -----
From: "Yuelin Li" <yuelin at mail.med.upenn.edu>
To: <r-help at stat.math.ethz.ch>
Sent: Wednesday, August 28, 2002 12:28 PM
Subject: [R] all possible subsets of r out of n
> Has anyone written a function that returns all possible
> subsets of r elements out of a vector that contains n
> elements? I have not been able to find an answer in the FAQ
> or the archives.
>
> Say I have a vector: letters[1:10]. I want to get a matrix
> of 120 rows that contains all possible subsets of 3 letters
> out of the 10. And I would like to be able to generalize to
> any r out of n, like function(x=letters[1:10], r=3) that
> returns:
>
> a, b, c
> a, b, d
> a, b, e
> ...
>
> etc.
>
> Many thanks in advance,
>
> - Yuelin Li.
>
> -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
-.-.-
> r-help mailing list -- Read
http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
> Send "info", "help", or "[un]subscribe"
> (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch
>
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.
_._
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
More information about the R-help
mailing list