I have been struggling trying to write some code to produce all
combinations subject to some restrictions. I thought someone might have
some bright ideas.
I have 11 values which fall into 5 groups. I want all combinations of
2,3, and 4 values where each value must be from a different group. The
numbers in the groups are different. Here is a definition of the groups:
groups <- list(gp1 = 1:3, gp2 = 4:5, gp3 = 6:7,
gp4 = 8:10, gp5 = 11)
I don't need the problem to be generalized at all---I just want to solve
this problem.
My approach so far has been to use combinations() from gtools to select
the combinations of groups and then to try and expand from there. I am
nearly there I think but it seems excessively complicated. I can
definitely do the all combinations of 2 from 11 subject to the group
restriction.
Suggestions are most welcome.
David Scott
_________________________________________________________________
David Scott Department of Statistics
The University of Auckland, PB 92019
Auckland 1142, NEW ZEALAND
Phone: +64 9 923 5055, or +64 9 373 7599 ext 85055
Email: d.scott at auckland.ac.nz, Fax: +64 9 373 7018
Director of Consulting, Department of Statistics
you could try something like the following:
groups <- list(gp1 = 1:3, gp2 = 4:5, gp3 = 6:7,
gp4 = 8:10, gp5 = 11)
combn(5, 2, function (x) expand.grid(groups[x]), simplify = FALSE)
combn(5, 3, function (x) expand.grid(groups[x]), simplify = FALSE)
combn(5, 4, function (x) expand.grid(groups[x]), simplify = FALSE)
I hope it helps.
Best,
Dimitris
David Scott wrote:> I have been struggling trying to write some code to produce all
> combinations subject to some restrictions. I thought someone might have
> some bright ideas.
>
> I have 11 values which fall into 5 groups. I want all combinations of
> 2,3, and 4 values where each value must be from a different group. The
> numbers in the groups are different. Here is a definition of the groups:
>
> groups <- list(gp1 = 1:3, gp2 = 4:5, gp3 = 6:7,
> gp4 = 8:10, gp5 = 11)
>
> I don't need the problem to be generalized at all---I just want to
solve
> this problem.
>
> My approach so far has been to use combinations() from gtools to select
> the combinations of groups and then to try and expand from there. I am
> nearly there I think but it seems excessively complicated. I can
> definitely do the all combinations of 2 from 11 subject to the group
> restriction.
>
> Suggestions are most welcome.
>
> David Scott
>
> _________________________________________________________________
> David Scott Department of Statistics
> The University of Auckland, PB 92019
> Auckland 1142, NEW ZEALAND
> Phone: +64 9 923 5055, or +64 9 373 7599 ext 85055
> Email: d.scott at auckland.ac.nz, Fax: +64 9 373 7018
>
> Director of Consulting, Department of Statistics
>
> ______________________________________________
> R-help at 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.
>
--
Dimitris Rizopoulos
Assistant Professor
Department of Biostatistics
Erasmus University Medical Center
Address: PO Box 2040, 3000 CA Rotterdam, the Netherlands
Tel: +31/(0)10/7043478
Fax: +31/(0)10/7043014
Dimitris Rizopoulos wrote:> you could try something like the following: > > groups <- list(gp1 = 1:3, gp2 = 4:5, gp3 = 6:7, > gp4 = 8:10, gp5 = 11) > > combn(5, 2, function (x) expand.grid(groups[x]), simplify = FALSE) > combn(5, 3, function (x) expand.grid(groups[x]), simplify = FALSE) > combn(5, 4, function (x) expand.grid(groups[x]), simplify = FALSE) >and this transforms it nicely into a single matrix y <- combn(5, 2, function (x) as.matrix(expand.grid(groups[x])), simplify = FALSE) Reduce(rbind, y) Bernd
Bernd Bischl wrote:> Dimitris Rizopoulos wrote: >> you could try something like the following: >> >> groups <- list(gp1 = 1:3, gp2 = 4:5, gp3 = 6:7, >> gp4 = 8:10, gp5 = 11) >> >> combn(5, 2, function (x) expand.grid(groups[x]), simplify = FALSE) >> combn(5, 3, function (x) expand.grid(groups[x]), simplify = FALSE) >> combn(5, 4, function (x) expand.grid(groups[x]), simplify = FALSE) >> > and this transforms it nicely into a single matrix > > y <- combn(5, 2, function (x) as.matrix(expand.grid(groups[x])), > simplify = FALSE) > Reduce(rbind, y) > > > Bernd >This is absolutely, totally awesome guys. Thanks very much. For the benefit of other readers, here is what happened. I spent 10 minutes composing a question (tried to make it easy to set up). Went off and did some other emailing, decided to check R-help and there were two replies answering my question perfectly. Thanks again David Scott _________________________________________________________________ David Scott Department of Statistics The University of Auckland, PB 92019 Auckland 1142, NEW ZEALAND Phone: +64 9 923 5055, or +64 9 373 7599 ext 85055 Email: d.scott at auckland.ac.nz, Fax: +64 9 373 7018 Director of Consulting, Department of Statistics