Возможно, это не идеальный ответ, но у меня возникла похожая проблема, и я справляюсь с ней, используя dplyr::group_by
и dplyr::sanple_n
.Мне нужно было сбалансированное обучение и тестирование по группам, и набор данных test
, который был подмножеством моих данных, людей, которых не было в наборе данных train
.
Например, используя знаменитый mtcars
набор данных:
library(dplyr)
mtcars %>% # in your case your data
group_by(cyl) %>% # in your case Centers
sample_n(2) # here the numbers of the sample for each group
Таким образом, это становится:
train <- data %>% group_by(Centers) %>% sample_n(28)
Это означает, что если у вас есть 200 строк и 5 центров, и одинаковое количество людей для каждого центра, (давайте назовемсбалансировано), у вас есть 200/5 = 40 для каждой группы, поэтому sample_n
без повторений может быть максимум 40.
В случае сбалансированных данных на группу, если моя математика не ошибается, вы можете установить 28 (200/100 * 70/5), чтобы обеспечить 70% охват, сбалансированный для каждой группы.
Если группа не сбалансирована, без повторения вы можете установить параметр до наименьшей группы.
В других руках вы должны установить повторение.
Чтобы установить тестирование, если вы хотите, чтобы лица, которые не участвуют в обучении, вы можете сделать это:
test <- data %>% filter(!ID %in% train%ID)
Надеюсь, это поможет.