Вот еще один подход с использованием пакета plyr:
library(plyr)
#Make some fake data
set.seed(1)
dat <- data.frame(subject = rep(c(1,4,2,6), each = 3), rate = sample(1:20, 12, TRUE))
set.seed(1)
#Assign treatment based on the subject ID. This does not ensure that you will get
#at least one subject in each treatment group.
ddply(dat, "subject", transform, treatment = sample(letters[1:2], TRUE))
РЕДАКТИРОВАТЬ - на ваш комментарий
Учитывая, что вы хотите указать, какому субъекту назначается какое лечение, предложение Гэвина о merge
является точным. Сначала я создал бы новый data.frame, который содержит одну запись для каждого уникального субъекта, назначил их обработку, а затем объединил их вместе:
treatments <- data.frame(subject = unique(dat$subject), treats = c("a", "b", "b", "a"))
merge(dat, treatments)
Обратите внимание, что порядок unique(dat$subject)
равен 1,4,2,6, что соответствует порядку значений в исходном data.frame. Если ваша реальная проблема содержит более четырех предметов, вы можете рассмотреть более автоматизированный способ назначения групп лечения. Один из подходов, которые я использовал в прошлом, заключается в назначении случайного числа каждому респонденту, а затем в назначении групп на основе заданного порога этого случайного числа. По сути, это то же самое, что и описанный выше подход, но может гарантировать, что вы получите равные числа в каждой группе. Например:
dat <- ddply(dat, "subject", transform, treatment = runif(1))
dat <- within(dat, treatment <- ifelse(treatment < quantile(treatment, 0.5),"a", "b"))