当Obs数大于26时,二进制排列表变得太大

时间:2019-07-11 17:53:55

标签: r permutation

我目前有一个包含16个观测值的数据集。我有二元治疗任务(目前有8个对照,8个治疗)。我需要为该数据集导出所有可能的不同处理分配,这些分配仍以8个对照和8个处理结束。我目前正在为16个观察值生成0和1的所有可能排列,并为8个对照或8种处理过滤。不幸的是,如果我需要进行26次以上的观察(我相信是幻数),那么数据帧对于R来说太大了。有什么方法可以创建一个置换表,而又省去了复制所有可能性并将其过滤到表格中的麻烦。中间,如下面的代码所示。

    library(tidyverse)
    library(random)
    library(data.table)

    test <- tibble("obs"=1:16,
    "treatment"=c(rep(0,8),rep(1,8)),
    "outcome"=randomNumbers(x,0,50,1))

    treated <- sum(test$treatment)

    perm <- do.call(CJ, replicate(16,0:1, FALSE))
    perm <- perm %>% mutate(check=rowSums(perm)) %>% filter(., check == treated)
    perm$check <- NULL
    perm <- as_tibble(transpose(perm))

1 个答案:

答案 0 :(得分:1)

8×12870 co矩阵的列是对治疗组的可能分配,其余项目则分配给对照。这里的12870等于choose(16, 8),即从16个项目中选择8个项目的方式数量。

co <- combn(16, 8)

例如,co[, 1]是1、2、3、4、5、6、7、8,因此如果选择了该列,则将前8个项目分配给治疗组,而后8个是控件。