Случайное распределение лечения на половину группы - PullRequest
4 голосов
/ 04 мая 2020

Я нахожусь в процессе случайного назначения процедур для эксперимента. У меня есть четыре сайта (Site1, ... Site4), где 12 экспериментальных единиц (например, 1 ... 12) дублируются четыре раза (например, 1 ... 4). Для каждой реплики я случайным образом назначил одну из трех обработок (например, trt1 ... trt3).

Теперь мне нужно назначить SecondTreatment (y или нет) для каждой обработки в реплике для каждой из моих Места. trt2 всегда должно быть «y», тогда как я хочу случайным образом назначить «y» половине trt1, а «n» - другой половине trt1, а затем сделать то же самое для trt3. Я должен дать мне для каждой реплики: trt2 с 4 "y", trt1 с 2 "n" и trt3 с 3 "n".

Мои данные выглядят так:

Site      Experimental unit     Replicate   Treatment        SecondTreatmentAssign (y/n)
Site1              1                1         trt1  
Site1              2                1         trt2  
Site1              3                1         trt3  
Site1              4                1         trt3  
Site1              5                1         trt1  
Site1              6                1         trt2  
Site1              7                1         trt3  
Site1              8                1         trt2  
Site1              9                1         trt1  
Site1              10               1         trt1  
Site1              11               1         trt3  
Site1              12               1         trt2  
Site1              1                2         trt2  
Site1              2                2         trt3  
Site1              3                2         trt1  
Site1              4                2         trt2  
Site1              5                2         trt1  
Site1              6                2         trt3  
Site1              7                2         trt2  
Site1              8                2         trt2         
Site1              9                2         trt1  
Site1              10               2         trt2  
Site1              11               2         trt1  
Site1              12               2         trt3      
Site1              1                3         trt2  
Site1              2                3         trt1  
Site1              3                3         trt3  
Site1              4                3         trt3  
Site1              5                3         trt2  
Site1              6                3         trt1  
Site1              7                3         trt3  
Site1              8                3         trt2  
Site1              9                3         trt1  
Site1              10               3         trt1  
Site1              11               3         trt3  
Site1              12               3         trt2  
Site1              1                4         trt3  
Site1              2                4         trt2  
Site1              3                4         trt1  
Site1              4                4         trt3  
Site1              5                4         trt2  
Site1              6                4         trt1  
Site1              7                4         trt3  
Site1              8                4         trt1  
Site1              9                4         trt2  
Site1              10               4         trt1  
Site1              11               4         trt2  
Site1              12               4         trt3
  .                .                .           .
  .                .                .           .
  .                .                .           .
Site4              12               4         trt1  

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

Спасибо!

1 Ответ

3 голосов
/ 04 мая 2020

Я бы сделал это:

library(dplyr) 
data %>% 
  arrange(runif(n())) %>% # randomize the order
  group_by(Site, Replicate, Treatment) %>% # group
  mutate(
    Treat_2 = case_when(
      Treatment == "trt2" ~ "y", # trt2 gets 'y'
      row_number() <= n() / 2 ~ "y", # others in the first half get "y"
      TRUE ~ "n" # others in the second half get "n"
  )) %>%
  arrange(Site, Replicate, `Experimental unit`) ## return to original order
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...