首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据集分成两半,随机选择所选变量的每一级别的一半

将数据集分成两半,随机选择所选变量的每一级别的一半
EN

Stack Overflow用户
提问于 2016-08-27 02:22:35
回答 3查看 1K关注 0票数 0

我知道如何完全随机地将数据集一分为二没有问题,但当我“逻辑地”理解如何去做我想要做的事情时,这里的转折似乎让我迷失了方向。

所以我有一个包含分类变量Title的数据集,它有120个级别。每个级别有50个观察值。我想以这样一种方式将数据集一分为二,即半集A和半集B中的每一个都随机获得每个级别Title的50个观察值中的25个。(这是针对全民教育和CFA的)

我认为这会涉及到一个for循环来遍历120层和sample(nrow(subset(dataset,title=index), 25),但除此之外我还有点迷茫。我想到的一些可能的解决方案是为半集A随机选择一个25,但需要替换,所以当我再次运行它来生成半集B时,它有一些重叠。

示例数据:

代码语言:javascript
复制
set.seed(1)
dataset = data.frame(id = rep(1:120, 50), v = rnorm(120*50))

一如既往的感谢大家。

EN

回答 3

Stack Overflow用户

发布于 2016-08-27 02:35:29

我将按标题对数据执行group_by操作,然后在每个数据中执行sample操作,以获得随机排序并使用此命令对data.frame执行split操作

代码语言:javascript
复制
#some data
df <- data.frame(title = letters[1:5], col = rnorm(30))

library(dplyr)
df2 <- df %>% group_by(title) %>% mutate(group = sample(n())/n() > 0.5)
split(df2, df2$group)
票数 2
EN

Stack Overflow用户

发布于 2016-08-27 02:42:34

考虑使用插入符号包。下面的代码使用了它们的指令:

代码语言:javascript
复制
library(caret)
set.seed(1); DF = data.frame(id = rep(1:120, 50), v = rnorm(120*50))
trainIndex <- createDataPartition(DF$id, p = .5,
                                  list = FALSE,
                                  times = 1)

DFTrain <- DF[ trainIndex,]
DFTest  <- DF[-trainIndex,]
table(DFTrain$id)

有关使用Caret包拆分数据的更多信息:Data Splitting

票数 2
EN

Stack Overflow用户

发布于 2016-08-27 02:47:19

这是一个经典的拆分-应用-合并问题。使用虹膜数据:

代码语言:javascript
复制
x <- do.call(rbind,lapply(split(iris,iris$Species), function(x) x[sample(round(nrow(x)/2)),]))
summary(x)
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.550   1st Qu.:0.300  
 Median :5.800   Median :3.000   Median :4.500   Median :1.400  
 Mean   :5.872   Mean   :3.061   Mean   :3.804   Mean   :1.212  
 3rd Qu.:6.450   3rd Qu.:3.350   3rd Qu.:5.100   3rd Qu.:1.800  
 Max.   :7.700   Max.   :4.400   Max.   :6.900   Max.   :2.500  
       Species  
 setosa    :25  
 versicolor:25  
 virginica :25

或者,您也可以通过对拆分变量中每个级别的行进行采样来选择数据框中的行:

代码语言:javascript
复制
y <- iris[unlist(lapply(levels(iris$Species), function(x) sample(which(iris$Species==x),round(sum(iris$Species==x)/2)))),]
summary(y)
  Sepal.Length    Sepal.Width    Petal.Length    Petal.Width          Species  
 Min.   :4.300   Min.   :2.00   Min.   :1.000   Min.   :0.100   setosa    :25  
 1st Qu.:5.100   1st Qu.:2.70   1st Qu.:1.500   1st Qu.:0.350   versicolor:25  
 Median :5.700   Median :3.00   Median :4.200   Median :1.300   virginica :25  
 Mean   :5.784   Mean   :3.02   Mean   :3.725   Mean   :1.204                  
 3rd Qu.:6.400   3rd Qu.:3.30   3rd Qu.:5.250   3rd Qu.:1.800                  
 Max.   :7.900   Max.   :4.40   Max.   :6.600   Max.   :2.500                  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39172540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档