Я пытаюсь создать фрейм данных, содержащий все возможные комбинации A и B в строке из шести символов. Например, (A, A, B, B, A, A) и (A, A, B, A, A, A) и т. д. Сначала я присвоил 6 переменной n, а затем создал простую вектор с 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().
Вы на правильном пути, если посмотрите на 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
требует list
аргументов, нам нужно указать replicate
не упрощать до массива (что по умолчанию он пытается сделать).
Ха, я так долго делал do.call(expand.grid, ...)
, что понятия не имею, вел ли он когда-либо себя по-другому. Дэнг, спасибо @PierreLapointe.
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
....
Однако мне не удалось использовать репликацию с 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 = ""))
Это лучший ответ. Хочу отметить, что
expand.grid(replicate(6, c("A","B"), simplify = FALSE))
работает безdo.call