R 如何将数据随机分成三个相等的大小?
我有一个来自三个不同项目的9558行数据集。我想将此数据集随机分成三个相等的组,并为每个组分配一个唯一的ID,以便R 如何将数据随机分成三个相等的大小?,r,random,group-by,dplyr,divide,R,Random,Group By,Dplyr,Divide,我有一个来自三个不同项目的9558行数据集。我想将此数据集随机分成三个相等的组,并为每个组分配一个唯一的ID,以便Project1\u Project\u 2\u Project3变成Project1,Project2和Project3 我尝试过很多东西,谷歌搜索过和我有类似问题的人的代码。我使用了sample\u n()和sample\u frac(),但不幸的是,我自己无法解决这个问题:/ 我制作了一个数据集示例,如下所示: ProjectName <- c("Project1_Pro
Project1\u Project\u 2\u Project3
变成Project1
,Project2
和Project3
我尝试过很多东西,谷歌搜索过和我有类似问题的人的代码。我使用了sample\u n()
和sample\u frac()
,但不幸的是,我自己无法解决这个问题:/
我制作了一个数据集示例,如下所示:
ProjectName <- c("Project1_Project2_Project3")
data <- data.frame(replicate(10,sample(0:1,9558,rep=TRUE)))
data <- data.frame(ProjectName, data)
将
id
添加到数据中
:
data$id <- 1:nrow(data)
剩余部分的一半样本:
project3 <- dplyr::sample_frac(project2, 0.5)
检查所有id
s是否唯一:
# 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)
我曾经有过同样的问题。我就是这样做的。如果你只是使用sample,那么这些组是不均匀的,通过对一个向量进行采样,这些组甚至为我工作
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 ,]
sampleframe我喜欢Github gist的解决方案
您可以按照建议生成索引:
folds <- split(sample(nrow(data), nrow(data), replace = FALSE), as.factor(1:3))
foldsIMO只分配随机项目名称就足够了
dat$ProjectName <- sample(factor(rep(1:3, length.out=nrow(dat)),
labels=paste0("Project", 1:3)))
数据
set.seed(42)
dat当你说“拆分”时,这意味着你不希望在组中重复,对吗?正如15中的数据仅在1集合中一样,c(“Project1”、“Project2”、“Project3”)
而不是c(“Project1\u Project2\u Project3”)
给你想要的?@Hojo.Timberwolf是的,我不想在小组中重复。15中的“仅1个”是什么意思?@jay.sf我拥有的真实数据集包含来自三个不同项目的数据,并且只有一个唯一的ID,其结构与我制作的相同。但是我想把它随机分成三个相等的组,每个组都应该有自己的名字:Project1、Project2和Project3:)这个问题需要简单地修改,并以更好的方式提问,以便对其他人也有用!非常感谢你菲尔:)
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 ,]
folds <- split(sample(nrow(data), nrow(data), replace = FALSE), as.factor(1:3))
datalist <- lapply(folds, function(x) data[x, ])
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)))