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