Создание списка всех возможностей

#r

#r

Вопрос:

Я пытаюсь создать фрейм данных, содержащий все возможные комбинации A и B в строке из шести символов. Например, (A, A, B, B, A, A) и (A, A, B, A, A, A) и т.д… Сначала я присвоил переменной n значение 6, а затем создал простой вектор с A и B.

 n <- 6
choice <- c("A", "B")
 

Затем я использовал sample() для выбора случайной буквы с заменой шесть раз. Часть моего кода sample() функционирует так, как я хочу, но я изо всех сил пытаюсь составить список всех возможностей. Вот что у меня есть до сих пор:

 list <- rep(list(sample(choices, n, replace = TRUE)))
 

Но это дает мне только одну строку. Я хочу, чтобы это было столько строк, сколько требуется для покрытия каждой возможности. Я подумал, что, возможно, expand.grid() поможет:

 df <- <- expand.grid(as.character(list))
 

Но проблема здесь в том, что все строки идентичны, поэтому, очевидно, я не получаю все возможности. Кто-нибудь, пожалуйста, поможет мне создать список со всеми возможными комбинациями A и B с заменой?

К сожалению, я не должен использовать функцию permutations() .

Ответ №1:

Вы на правильном пути, посмотрев на expand.grid .

(Спасибо PierreLapointe за то, что помогли мне немного упростить это.)

 head(expand.grid(replicate(6, c("A", "B"), simplify = FALSE)))
#   Var1 Var2 Var3 Var4 Var5 Var6
# 1    A    A    A    A    A    A
# 2    B    A    A    A    A    A
# 3    A    B    A    A    A    A
# 4    B    B    A    A    A    A
# 5    A    A    B    A    A    A
# 6    B    A    B    A    A    A
 

Сначала генерируется список аргументов для передачи expand.grid : шесть позиций, каждая позиция со своими возможными значениями. Поскольку все шесть позиций содержат одинаковые значения кандидатов, мы можем использовать replicate(6, ...) здесь. Поскольку expand.grid требуется a list аргументов, нам нужно указать replicate , чтобы не упрощать до массива (что он по умолчанию пытается сделать).

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

1. Это лучший ответ. Я бы отметил, что expand.grid(replicate(6, c("A","B"), simplify = FALSE)) работает без do.call

2. Ха, я так долго этим занимался do.call(expand.grid, ...) , что понятия не имею, вел ли он себя когда-нибудь по-другому. Черт возьми, спасибо @PierreLapointe.

Ответ №2:

эквивалент data.table :

 librarie(data.table)
CJ(c("A","B"),
   c("A","B"),
   c("A","B"),
   c("A","B"),
   c("A","B"),
   c("A","B"))

   V1 V2 V3 V4 V5 V6
 1:  A  A  A  A  A  A
 2:  A  A  A  A  A  B
 3:  A  A  A  A  B  A
 4:  A  A  A  A  B  B
 5:  A  A  A  B  A  A
 ....
 

Однако мне не удалось использовать replicate with CJ .

Если вы хотите векторный список:

 CJ(c("A","B"),
   c("A","B"),
   c("A","B"),
   c("A","B"),
   c("A","B"),
   c("A","B")) %>%
  apply(.,1,function(x) paste0(x,collapse = ""))