Helpers - компьютеры, интернет, программирование

Сгенерировать все комбинации с заданным ограничением

Как я могу сгенерировать все 6 комбинаций двух процедур (A, B) в блоках по 4, чтобы в каждом блоке было равное количество A и B, используя R?

"AABB","ABAB","ABBA","BBAA","BABA","BAAB" 

P.S. Количество комбинаций рассчитывается следующим образом:

If

T = #treatments

n = #treatments in each block = k*T,

Количество комбинаций равно n! / [k!*k! (T times)]

Спасибо

28.01.2012

  • побочный вопрос: вы имеете в виду, что количество комбинаций равно n! /( (к!)^Т) ? 28.01.2012

Ответы:


1

Что-то вроде этого должно работать:

library(gtools)

t <- c('A','B')
k <- 2
n <- k * length(t)

t2 <- rep(t, k)
m <- permutations(n,n)
res <- unique(apply(m,MARGIN=1,function(x) paste(t2[x],collapse='')))

--------------------------------------------------------------------
res
[1] "ABAB" "ABBA" "AABB" "BAAB" "BABA" "BBAA"
28.01.2012

2

Пакет multicool реализует алгоритм перестановки мультимножеств --- именно та задача, которую вы хотите выполнить. Вот пример того, что он может сделать:

library(multicool)

# Create a simple convenience function
enumAllPartitions <- function(multiset) {
    m1 <-  initMC(multiset)        # Initialize the permutation object
    N <- fact(length(multiset))/   # Calculate number of permutations
         prod(fact(table(multiset)))
    sapply(seq_len(N), function(X) paste(nextPerm(m1), collapse=""))
}

# Try it out with a few different multisets
x <- c("A", "A", "B", "B")
y <- c("G", "L", "L", "L")
z <- c("X", "X", "Y", "Z", "Z")

lapply(list(x,y,z), enumAllPartitions)
[[1]]
[1] "BBAA" "ABBA" "BABA" "ABAB" "AABB" "BAAB"

[[2]]
[1] "LLLG" "GLLL" "LGLL" "LLGL"

[[3]]
 [1] "ZZYXX" "XZZYX" "ZXZYX" "ZZXYX" "XZZXY" "ZXZXY" "XZXZY" "XXZZY" "ZXXZY"
[10] "ZZXXY" "YZZXX" "ZYZXX" "XZYZX" "ZXYZX" "YZXZX" "XYZZX" "YXZZX" "ZYXZX"
[19] "XZYXZ" "ZXYXZ" "XZXYZ" "XXZYZ" "ZXXYZ" "YZXXZ" "XYZXZ" "YXZXZ" "XYXZZ"
[28] "XXYZZ" "YXXZZ" "ZYXXZ"
29.01.2012

3

Ожидаемое решение также может быть достигнуто с помощью нового пакета iterpc.

I <- iterpc(c(2, 2), labels=c("A", "B"), ordered=TRUE)
getall(I)

#      [,1] [,2] [,3] [,4]
# [1,] "A"  "A"  "B"  "B" 
# [2,] "A"  "B"  "A"  "B" 
# [3,] "A"  "B"  "B"  "A" 
# [4,] "B"  "A"  "A"  "B" 
# [5,] "B"  "A"  "B"  "A" 
# [6,] "B"  "B"  "A"  "A" 
29.10.2017
Новые материалы

Интуитивное понимание тензоров в машинном обучении
Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

Почему объяснимость так важна прямо сейчас?
По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

Анимированный математический анализ
Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

Создание простого слайдера изображений с помощью JavaScript
Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

Создание базы данных с помощью супергероя «Python»
В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

ИИ для чайников: руководство для начинающих по пониманию будущего технологий
Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..