Prof Brian D Ripley (ripley@stats.ox.ac.uk)
Tue, 14 Dec 1999 11:14:04 +0000 (GMT)
On Mon, 13 Dec 1999, a s wrote:
> I need some help here.
> >From a vector of variable length (say, c(A,B,C,D), I need to obtain all
> posible combinations (order doesn't matter) of the elements.
> I would like a function such as:
> function(x,c(A,B,C,D))
> to give a matrix (for x=3) like:
> A B C
> A B D
> A C D
> B C D
>
> or for x=2
> A B
> A C
> A D
> B C
> B D
> C D
>
> And so on.
> Any ideas??
There is code to do that in Venables & Ripley, called subsets. Here's
a later version (from our forthcoming `S Programming' book)
subsets <- function(n, r, s = 1:n) {
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(s) || length(s) < n)
stop("s is either non-atomic or too short")
fun <- function(n, r, s)
if(r <= 0) vector(mode(s), 0) else if(r >= n) s[1:n] else
rbind(cbind(s[1], Recall(n - 1, r - 1, s[-1])),
Recall(n - 1, r, s[-1]))
fun(n, r, s)
}
Use it by
subs <- function(x, string)
subsets(length(string), x, string)
You will need quotes! Actually, this will work for any (atomic) mode of
vector. If you have long strings,
subs <- function(x, string)
{
z <- subsets(length(string), x)
zz <- string[as.vector(z)]
dim(zz) <- dim(z)
zz
}
might be better.
-- Brian D. Ripley, ripley@stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272860 (secr) Oxford OX1 3TG, UK Fax: +44 1865 272595-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- 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@stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
This archive was generated by hypermail 2.0b3 on Tue 04 Jan 2000 - 13:34:03 EST