【问题标题】:multiple sampling in R [duplicate]R中的多重采样[重复]
【发布时间】:2019-05-23 14:25:17
【问题描述】:

我想知道如何在R中进行多次采样。例如,当我尝试将一些数据划分为60(训练数据):40(验证数据)时,我可以这样编写代码:

original.data = read.csv("~.csv", na.strings="")              
train.index = sample(c(1:dim(original.data)[1]), dim(original.data)[1]*0.6)

train.data = original.data[train.index,]
valid.data = original.data[-train.index,]

但是,很难弄清楚像将一些数据分成 60:20:20 那样进行多重采样。

如果您让我知道最佳解决方案,我将不胜感激!

【问题讨论】:

  • 该问题中解决两个以上测试(由“60:20:20”建议)的唯一答案是deleted(因此对大多数用户不可见),因此除非打算使用 OP 推断下一步(使用prob=,没有一个仍然存在的答案使用),这不是17200114的重复

标签: r multisampling


【解决方案1】:

如果您想要多于两组,那么其他解决方案也很接近,但您只需要多一点。至少有两种选择。

第一:

set.seed(2)
table(samp <- sample(1:3, size = nrow(iris), prob = c(0.6, 0.2, 0.2), replace = TRUE))
#  1  2  3 
# 93 35 22 

nrow(iris) # 150
set1 <- iris[samp == 1,]
set2 <- iris[samp == 2,]
set3 <- iris[samp == 3,]

set1 <- iris[samp == 1,]
set2 <- iris[samp == 2,]
set3 <- iris[samp == 3,]
nrow(set1)
# [1] 93
nrow(set2)
# [1] 35
nrow(set3)
# [1] 22

因为它是随机的,所以您总是希望得到准确的比例。

第二:

如果你必须有精确的比例,你可以这样做:

ns <- nrow(iris) * c(0.6, 0.2, 0.2)
sum(ns)
# [1] 150
### in case of rounding (and sum != nrow) ... just fix one of ns

rep(1:3, times = ns)
#   [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
#  [46] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
#  [91] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
# [136] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
set.seed(2)
head(samp <- sample(rep(1:3, times = ns)))
# [1] 1 2 1 1 3 3

set1 <- iris[samp == 1,]
set2 <- iris[samp == 2,]
set3 <- iris[samp == 3,]
nrow(set1)
# [1] 90
nrow(set2)
# [1] 30
nrow(set3)
# [1] 30

这可以很容易地推广到支持任意数量的分区。

【讨论】:

  • 非常感谢您的友好回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
相关资源
最近更新 更多