Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何将数据随机分成三个相等的大小?_R_Random_Group By_Dplyr_Divide - Fatal编程技术网

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

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

我有一个来自三个不同项目的9558行数据集。我想将此数据集随机分成三个相等的组,并为每个组分配一个唯一的ID,以便
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)))