[R] combinatorics again
Jacques VESLOT
jacques.veslot at cirad.fr
Mon Mar 6 10:17:15 CET 2006
> library(gtools)
> combinations(5,3)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 1 2 4
[3,] 1 2 5
[4,] 1 3 4
[5,] 1 3 5
[6,] 1 4 5
[7,] 2 3 4
[8,] 2 3 5
[9,] 2 4 5
[10,] 3 4 5
Robin Hankin a écrit :
>Hi
>
>I want to enumerate all vectors of length "J", whose elements are
>integers in the range 1 to S, without regard to ordering.
>
>With J=S=3, the combinations are as follows:
>
>
> [,1] [,2] [,3]
> [1,] 1 1 1
> [2,] 1 1 2
> [3,] 1 1 3
> [4,] 1 2 2
> [5,] 1 2 3
> [6,] 1 3 3
> [7,] 2 2 2
> [8,] 2 2 3
> [9,] 2 3 3
>[10,] 3 3 3
>
>
>Note that (eg) c(1,2,1) is not on the list because we already have
>c(1,1,2) which would be equivalent [because the problem is to
>enumerate the cases without regard to ordering] and I do not want
>repeats.
>
>The best I can do is to create all S^J possibilities and weed out the
>repeats, using unique() ; code below.
>
>Why is this no good? Well, even for the tiny case of J=S=10, this
>would require a matrix of 10^10 rows, and my little linux machine
>refuses to cooperate, complaining about allocating a vector of
>length 1410065408. For these values of J and S, I happen to know
>that the are 6360 distinct combinations, which is eminently handleable.
>
>
>Anyone got any better ideas?
>
>
>
>
>
>
>allcomb <- function(J,S){
>
> f <- function(...) {
> 1:S
> }
> out <- as.matrix(do.call("expand.grid", lapply(1:J, FUN = f)))
> out <- t(apply(out,1,sort))
> unique(out)
>}
>
>
>--
>Robin Hankin
>Uncertainty Analyst
>National Oceanography Centre, Southampton
>European Way, Southampton SO14 3ZH, UK
> tel 023-8059-7743
>
>______________________________________________
>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