如何将数据随机分成三个相等的大小?

时间:2019-03-27 11:11:14

标签: r random group-by dplyr divide

我有一个数据集,其中包含来自三个不同项目的9558行。我想将此数据集随机分为三个相等的组,并为每个组分配一个唯一的ID,以便使Project1_Project_2_Project3变为Project1Project2Project3

我尝试了很多事情,并从与我有类似问题的人那里搜索了代码。我曾经使用过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 个答案:

答案 0 :(得分:2)

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 :(得分:2)

我曾经有过同样的问题。这就是我做的。如果您仅使用样本,则通过抽取矢量甚至可以为我工作的矢量,可以使组不均匀。

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 :(得分:2)

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)))

答案 3 :(得分:1)

我喜欢Github要旨的解决方案in this comment

您可以按照建议生成索引:

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

然后使用以下命令获得3个相等大小的数据帧的列表:

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