Вы можете сделать выборочную копию своего набора данных и сделать Conditie
симметрию c, выбрасывая случайным образом условие 1
случаев, превышающих количество условий 0
случаев.
set.seed(42)
iris.l2 <- iris.l[sort(c(sample(which(iris.l$cond == 1), sum(iris.l$cond == 0)),
which(iris.l$cond == 0))), ]
table(iris.l2$cond)
# 0 1
# 361 361
На втором шаге sample
из каждой группы условий отдельно, используя by
. Вместо столбца id
используйте вместо имен строк (в вашем случае SubjectID
, я называю это id
здесь).
# set.seed(42) ## already set above
train <- do.call(c, by(iris.l2, iris.l2$cond, function(x)
sample(x$id, (.75/4)*nrow(x))))
Теперь можно использовать ids
для выбора из выборочная копия.
TrainSet <- iris.l2[iris.l2$id %in% train, ]
ValidSet <- iris.l2[!iris.l2$id %in% train, ]
Теперь наборы точно 50: 50!
(t1 <- table(TrainSet$cond))
# 0 1
# 67 67
(t2 <- table(ValidSet$cond))
# 0 1
# 294 294
sum(t1 + t2)
# [1] 722
1 - (t1 / t2)
# 0 1
# 0.7721088 0.7721088 ## approximately the ratio chosen
Обратите внимание, , что ответ только технически показывает решение для кодирования. Возможно, вам следует обратиться за советом к статистику.
Пример данных:
set.seed(42)
iris.l <- `rownames<-`(iris[sample(1:nrow(iris), 999, replace=TRUE), ], NULL)
iris.l$id <- 1:nrow(iris.l)
iris.l$cond <- rbinom(nrow(iris.l), 1, 2/3) ## creates "cond" in 1:2 ratio
table(iris.l$cond)
# 0 1
# 361 638 ## approximately 1:2 due to random processing