如何将数据随机分成三个相等的大小?
How to randomly split data into three equal sizes?
我有一个包含来自三个不同项目的 9558 行的数据集。我想将这个数据集随机分成三个相等的组,并为每个组分配一个唯一的 ID,这样 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
将 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)
最后从 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)
我曾经遇到过同样的问题。我就是这样做的。如果你只是使用样本,那么这些组是不均匀的,通过抽取一个向量,其中这些组甚至对我有用。
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 ,]
我喜欢 in this comment Github 要点的解决方案。
您可以按照建议生成索引:
folds <- split(sample(nrow(data), nrow(data), replace = FALSE), as.factor(1:3))
然后使用以下方法获取 3 个大小相等的数据帧的列表:
datalist <- lapply(folds, function(x) data[x, ])
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)))
我有一个包含来自三个不同项目的 9558 行的数据集。我想将这个数据集随机分成三个相等的组,并为每个组分配一个唯一的 ID,这样 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
将 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)
最后从 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)
我曾经遇到过同样的问题。我就是这样做的。如果你只是使用样本,那么这些组是不均匀的,通过抽取一个向量,其中这些组甚至对我有用。
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 ,]
我喜欢 in this comment Github 要点的解决方案。
您可以按照建议生成索引:
folds <- split(sample(nrow(data), nrow(data), replace = FALSE), as.factor(1:3))
然后使用以下方法获取 3 个大小相等的数据帧的列表:
datalist <- lapply(folds, function(x) data[x, ])
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)))