Как случайным образом разделить данные на три равных размера? - PullRequest
2 голосов
/ 27 марта 2019

У меня есть набор данных с 9558 строками из трех разных проектов.Я хочу случайным образом разделить этот набор данных на три равные группы и назначить уникальный идентификатор для каждой группы, чтобы Project1_Project_2_Project3 стало Project1, Project2 и Project3.

Я пробовал много вещей и гуглил коды от людей с такой же проблемой, как и я.Я использовал sample_n() и sample_frac(), но, к сожалению, я не могу решить эту проблему самостоятельно: /

Я сделал пример того, как мой набор данных выглядит так:

ProjectName <- c("Project1_Project2_Project3")
data <- data.frame(replicate(10,sample(0:1,9558,rep=TRUE)))
data <- data.frame(ProjectName, data)

И выходные данные должны быть случайным образом разделены на три равные группы nrow=3186, а затем присвоены значения

ProjectName Count of rows
Project1     3186
Project2     3186
Project3     3186

Ответы [ 4 ]

2 голосов
/ 27 марта 2019

IMO должно быть достаточно назначить просто случайные имена проектов.

dat$ProjectName <- sample(factor(rep(1:3, length.out=nrow(dat)), 
                          labels=paste0("Project", 1:3)))

Результат

head(dat)
#   X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 ProjectName
# 1  1  1  0  1  1  1  1  0  1   0    Project1
# 2  1  1  1  1  1  1  0  0  1   0    Project1
# 3  0  0  1  1  0  0  0  1  1   1    Project1
# 4  1  1  1  0  1  0  1  1  0   1    Project3
# 5  1  0  0  1  1  1  1  0  0   1    Project1
# 6  1  0  0  0  0  1  0  1  1   1    Project3

table(dat$ProjectName)
# Project1 Project2 Project3 
#     3186     3186     3186 

Данные

set.seed(42)
dat <- data.frame(replicate(10, sample(0:1, 9558, rep=TRUE)))
2 голосов
/ 27 марта 2019

Однажды у меня была такая же проблема.Вот как я это сделал.Если вы просто используете выборку, группы получаются неравномерными, отбирая вектор, где группы даже работают для меня.

sampleframe <- rep(1:3, ceiling( nrow( data)/3 ) ) 

data$grp <- 0
data[  , "grp"  ] <- sample( sampleframe , size=nrow( data) ,  replace=FALSE )

project1 <- data[data$grp %in% 1 ,]
project2 <- data[data$grp %in% 2 ,]
project3 <- data[data$grp %in% 3 ,]
2 голосов
/ 27 марта 2019

Добавьте id к data:

data$id <- 1:nrow(data)

Возьмите первый образец:

project1 <- dplyr::sample_frac(data, 0.33333)

Удалить использованные строки из данных и сохранить в project2:

project2 <- data[!(data$id %in% project1$id), ]

Примерная половина остатка:

project3 <- dplyr::sample_frac(project2, 0.5)

Наконец удалите те из образца project3 из project2:

project2 <- project2[!(project2$id %in% project3$id), ]

Проверьте все id уникальны:

# should all be FALSE
any(project1$id %in% project2$id)
any(project1$id %in% project3$id)
any(project2$id %in% project3$id)

И еще раз проверьте правильность количества фреймов данных:

nrow(project1)
nrow(project2)
nrow(project3)
1 голос
/ 27 марта 2019

Мне нравится решение в этом комментарии в Github.

Вы можете сгенерировать индексы в соответствии с предложением:

folds <- split(sample(nrow(data), nrow(data), replace = FALSE), as.factor(1:3))

Затем получите список из 3 кадров данных одинакового размера, используя:

datalist <- lapply(folds, function(x) data[x, ])
...