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