Случайно распределите предметы по группам одинакового размера и просмотрите все возможные результаты - PullRequest
2 голосов
/ 05 марта 2020

Я хотел бы случайным образом распределить предметы в две группы одинакового размера и просмотреть все возможные результаты, используя R.

Например, предположим, что есть 10 предметов, и я хотел бы распределить их в Лечение и Контроль групп. Тогда есть (10!) / 5! 5! способы распределения предметов по двум группам. Вместо того, чтобы видеть один случайный результат, я хочу увидеть все возможные результаты. В идеале, я хочу видеть результаты примерно так:

[1] T T T T T C C C C C
[2] T T T T C T C C C C
     (omitted)
[252] C C C C C T T T T T  

C: контрольная группа, T: лечебная группа.

Существуют ли функции R, которые могут достичь этой цели? Спасибо

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Предлагаемое решение с использованием базы R: Сначала мы создаем матрицу с индексами для элемента управления "C" (combn(N_observation, floor(N_observation / 2))) и, используя apply, передаем каждый столбец этой "матрицы индекса" в функцию где мы сначала создаем вектор из «T» и используем индексы, чтобы изменить «T» на «C». Наконец, используя еще apply свертки столбцов в строки:

f <- function(N_observation) {
  apply(
    apply(combn(N_observation, floor(N_observation / 2)), 2, function(x) {
      vec <- rep("T", N_observation)
      vec[x] <- "C"
      return(vec)
    }), 2, paste0, collapse="")
}

f(4)

Возвращает:

[1] "CCTT" "CTCT" "CTTC" "TCCT" "TCTC" "TTCC"
0 голосов
/ 05 марта 2020

Я не уверен, что вы ищете это, я использую gtools::permutations. Поскольку перестановки всегда являются надмножеством комбинации 'C' и 'T', мы будем фильтровать только те строки, в которых количество 'C' и 'T' равно.

Дайте мне знать, если мой понимание не ясно, и решение не работает для вас.

library(gtools)
grps <- c('C', 'T')
n <- 10
p = permutations(length(grps), n, grps, repeats.allowed = TRUE)
data.frame(p[(rowSums(p == 'C') == n/length(grps)),], stringsAsFactors=FALSE)

Вывод для нескольких строк:

    X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1    C  C  C  C  C  T  T  T  T   T
2    C  C  C  C  T  C  T  T  T   T
3    C  C  C  C  T  T  C  T  T   T
4    C  C  C  C  T  T  T  C  T   T
5    C  C  C  C  T  T  T  T  C   T
6    C  C  C  C  T  T  T  T  T   C
7    C  C  C  T  C  C  T  T  T   T
8    C  C  C  T  C  T  C  T  T   T
9    C  C  C  T  C  T  T  C  T   T

В случае, если вы хотите вставить эти строки в отдельный вектор, тогда, вероятно, вы можете использовать do.call:

 grps <- c('C', 'T')
    n <- 10
    p = permutations(length(grps), n, grps, repeats.allowed = TRUE)
    dfs <- data.frame(p[(rowSums(p == 'C') == n/length(grps)),], stringsAsFactors=FALSE)
    do.call('paste0', dfs)

Выход для нескольких векторов :

  [1] "CCCCCTTTTT" "CCCCTCTTTT" "CCCCTTCTTT" "CCCCTTTCTT"
  [5] "CCCCTTTTCT" "CCCCTTTTTC" "CCCTCCTTTT" "CCCTCTCTTT"
  [9] "CCCTCTTCTT" "CCCTCTTTCT" "CCCTCTTTTC" "CCCTTCCTTT"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...