我知道如何完全随机地将数据集一分为二没有问题,但当我“逻辑地”理解如何去做我想要做的事情时,这里的转折似乎让我迷失了方向。
所以我有一个包含分类变量Title的数据集,它有120个级别。每个级别有50个观察值。我想以这样一种方式将数据集一分为二,即半集A和半集B中的每一个都随机获得每个级别Title的50个观察值中的25个。(这是针对全民教育和CFA的)
我认为这会涉及到一个for循环来遍历120层和sample(nrow(subset(dataset,title=index), 25),但除此之外我还有点迷茫。我想到的一些可能的解决方案是为半集A随机选择一个25,但需要替换,所以当我再次运行它来生成半集B时,它有一些重叠。
示例数据:
set.seed(1)
dataset = data.frame(id = rep(1:120, 50), v = rnorm(120*50))一如既往的感谢大家。
发布于 2016-08-27 02:35:29
我将按标题对数据执行group_by操作,然后在每个数据中执行sample操作,以获得随机排序并使用此命令对data.frame执行split操作
#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)发布于 2016-08-27 02:42:34
考虑使用插入符号包。下面的代码使用了它们的指令:
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
发布于 2016-08-27 02:47:19
这是一个经典的拆分-应用-合并问题。使用虹膜数据:
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或者,您也可以通过对拆分变量中每个级别的行进行采样来选择数据框中的行:
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 https://stackoverflow.com/questions/39172540
复制相似问题