Home > Mobile >  All possible combinations (sequential)
All possible combinations (sequential)

Time:10-27

I am wondering what an efficient approach to the following question would be:

Suppose I have three characters in group 1 and two characters in group 2:

group_1 = c("X", "Y", "Z")
group_2 = c("A", "B")

Clearly, the "all" possible combinations for group_1 and group_2 are given by:

group_1_combs = data.frame(X = c(0,1,0,0,1,1,0,1),
                           Y = c(0,0,1,0,1,0,1,1),
                           Z = c(0,0,0,1,0,1,1,1))
group_2_combs = data.frame(A = c(0,1,0,1),
                           B = c(0,0,1,1))

My question is the following:

(1) How do I go from group_1 to group_1_combs efficiently (given that the character vector might be large).

(2) How do I do an "all possible" combinations of each row of group_1_combs and group_2_combs? Specifically, I want a "final" data.frame where each row of group_1_combs is "permuted" with every row of group_2_combs. This means that the final data.frame would have 8 x 4 rows (since there are 8 rows in group_1_combs and 4 rows in group_2_combs) and 5 columns (X,Y,Z,A,B).

Thanks!

CodePudding user response:

You want expand.grid and merge:

Question 1:

group_1_combs <- expand.grid(setNames(rep(list(c(0, 1)), length(group_1)), group_1))
group_2_combs <- expand.grid(setNames(rep(list(c(0, 1)), length(group_2)), group_2))

Question 2:

> merge(group_1_combs, group_2_combs)
   X Y Z A B
1  0 0 0 0 0
2  1 0 0 0 0
3  0 1 0 0 0
4  1 1 0 0 0
5  0 0 1 0 0
6  1 0 1 0 0
7  0 1 1 0 0
...

Or you can go directly to the merged data.frame:

group_12 <- c(group_1, group_2)
expand.grid(setNames(rep(list(c(0, 1)), length(group_12)), group_12))
  • Related