Отображение всех возможных комбинаций категорий с ограничениями в R - PullRequest
1 голос
/ 17 июня 2020

У меня есть следующие 9 категорий, которые представляют разные условия в эксперименте. На самом деле у меня 25 различных условий, но для простоты я показываю только 9.

   1   2   3
A  A1  A2  A3
B  B1  B2  B3
C  C1  C2  C3

Каждый человек увидит 3 категории. Они увидят каждую букву (A, B, C) один раз и увидят каждое число (1, 2, 3) один раз. Порядок имеет значение.

Например, если они случайным образом сначала видят A1, то вторая категория, которую они видят, может быть B2, B3, C2 или C3. Если они видят C3 для второй категории, то единственным оставшимся вариантом для третьей категории является B2. Другой пример: если они случайно сначала видят C2, то вторыми могут видеть B1, B3, A1 или A3. Если они видят А1 вторым, они должны видеть В3 третьим.

Моя цель - создать эффективный способ найти все возможные способы представления участников по 3 категориям при соблюдении изложенных мной правил. Я знаю, как сделать это вручную, но полагаю, что в R. есть способ получше. Я просто не знаю, с чего начать. У вас есть какие-нибудь рекомендации, как я могу начать это настраивать?

Вот какой-то псевдокод:

for 1, 2, and 3
   select A, B, or C
       then select from the numbers from 1, 2, 3 that were not selected
           then select from the letters A, B, C not yet selected 
                select final unselected number 
                       select final unselected letter 

В идеале я хотел бы иметь возможность вводить следующее:

numbers <- c("1", "2", "3")
letters <- c("A", "B", "C") 

И результат будет выглядеть примерно так . Это только первые три строчки. Шаблон будет таким же для категорий, начинающихся с B и начинающихся с C.

A1: A1 B2 C3, A1 B3 C2, A1 C2 B3, A1 C3 B2
A2: A2 B1 C3, A2 B3 C1, A2 C1 B3, A2 C3 B1
A3: A3 B1 C2, A3 B2 C1, A3 C1 B2, A3 C2 B1

1 Ответ

1 голос
/ 17 июня 2020

Если я правильно понял, вам нужна перестановка с некоторыми исключениями.

Пакет "gtools" предоставляет функцию перестановок.

library(gtools)
v <- c("A1","A2","A3","B1","B2","B3","C1","C2","C3")
# Create the input dataframe
b <- data.frame(permutations(length(v),3,v))
# Create a new column with desired lines marked with "1"
b <- within(b, x4 <- {
  ifelse(
    (substr(X1,1,1) != substr(X2,1,1)) &
    (substr(X1,1,1) != substr(X3,1,1)) &
    (substr(X1,2,2) != substr(X2,2,2)) &
    (substr(X1,2,2) != substr(X3,2,2)) &
    (substr(X2,1,1) != substr(X3,1,1)) &
    (substr(X2,2,2) != substr(X3,2,2))
    ,1,0)  
})
# Exclude undesired lines marked with "0"
b <- b[b$x4 == 1,1:3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...