Все возможные комбинации (последовательные)

#r #dplyr #data.table

Вопрос:

Мне интересно, каким был бы эффективный подход к следующему вопросу:

Предположим, у меня есть три символа в группе 1 и два символа в группе 2:

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

Очевидно, что «все» возможные комбинации для групп_1 и групп_2 задаются:

 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))   

Мой вопрос заключается в следующем:

(1) Как мне эффективно перейти от group_1 к group_1_combs (учитывая, что вектор символов может быть большим).

(2) Как мне выполнить «все возможные» комбинации каждой строки group_1_combs и group_2_combs ? В частности, мне нужен «окончательный» фрейм данных, в котором каждая строка group_1_combs «переставляется» с каждой строкой . group_2_combs Это означает, что конечный data.frame будет иметь 8 x 4 строки (так как в нем 8 строк group_1_combs и 4 строки group_2_combs ) и 5 столбцов (X,Y,Z,A,B) .

Спасибо!

Комментарии:

1. Поскольку вы отметили data.table, возможно, захотите попробовать вариант ответа jblood с использованием CJ : group_1_combs lt;- do.call(CJ, setNames(rep(list(c(0, 1)), length(group_1)), group_1))

Ответ №1:

Ты хочешь expand.grid и merge :

Вопрос 1:

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

Вопрос 2:

 gt; 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 ...  

Или вы можете перейти непосредственно к объединенным данным.фрейм:

 group_12 lt;- c(group_1, group_2) expand.grid(setNames(rep(list(c(0, 1)), length(group_12)), group_12))