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

4
我有一个包含来自三个不同项目的 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

当你说“分割”时,这意味着你不想在组中重复,对吗?也就是说,数字15只在一个集合中。 - Hojo.Timberwolf
使用c("Project1", "Project2", "Project3")代替c("Project1_Project2_Project3")能得到你想要的结果吗? - jay.sf
@Hojo.Timberwolf 是的,我不想在组中重复。你在15中指的是只有1个集合吗? - Rose Nonglak Seesan Jensen
@jay.sf 我手头的真实数据集包含来自三个不同项目的数据,其中只有一个唯一的ID,并且其结构与我创建的相同。但是我想将其随机分成三个相等的组,每个组都应该有自己的名称:Project1、Project2和Project3 :) - Rose Nonglak Seesan Jensen
这个问题需要简单修改并以更好的方式提出,才能对其他人有用! - Majid
4个回答

4

我认为只需要分配随机的项目名称就足够了。

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

Result

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

我曾经遇到过同样的问题。这是我解决它的方法:如果你只使用样本,那么分组会不均匀。从一个分组均匀的向量中进行抽样对我有用。

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 ,]

3

我喜欢这篇评论提出的解决方案,适用于GitHub Gist。

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

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

然后使用以下命令获取三个大小相等的数据框列表:
datalist <- lapply(folds, function(x) data[x, ])

2
data中添加一个id:
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)

最终,从project2中删除project3示例中的内容:

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接