我想将每个子组的一半分配给治疗条件,一半分配给对照组。当我的子组有奇数个记录时,可以任意分配最后一个。

我正在尝试在 dplyr 组中执行此操作并努力解决奇数/偶数。我试过这个:

set.seed(1)
library(dplyr)
mtcars %>%
  group_by(cyl) %>%
  mutate(group = case_when(
    n() %% 2 == 0 ~  sample(rep(c("treatment", "control"), n() / 2)),
    TRUE ~ sample(rep(c("treatment", "control"), ceiling(n() / 2)))[-1]
  ))

但我收到错误:



如果这种方法更简单,我也愿意使用 purrr

最佳答案

mtcars %>%
  group_by(cyl) %>%
  mutate(group = sample(rep(c("treatment", "control"), ceiling(n()/2)), n()))
  • 对于组中偶数个 n = 2k 行,它会打乱 k "treatment"和 k "control"值。
  • 对于奇数 n = 2k + 1 ,它从 2k + 1 “treatment” 和 k + 1 “control” 值中采样 k + 1 值。我相信这就是你所需要的。

  • 这当然可以推广到任意数量的组:
    mtcars %>%
      group_by(cyl) %>%
      mutate(group = sample(rep(c("A", "B", "C"), ceiling(n()/3)), n())) %>%
      count(cyl, group)
    

    关于不同规模的亚组内的随机化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58647807/

    10-12 17:33