首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带样本函数的过采样

带样本函数的过采样
EN

Stack Overflow用户
提问于 2018-10-15 22:11:16
回答 3查看 403关注 0票数 1

我想创建一个mtcars数据集,其中所有的圆柱都有100个观测。为此,我将用替换现有的观察结果作为样本。

我尝试了以下代码,由于某种原因,它不会产生300个观察结果。

代码语言:javascript
复制
library(data.table)
mtcars <- data.table(mtcars)
resampling <- list()
set.seed(3)

cyl <- sort(unique(as.character(mtcars$cyl)))
for (i in 1:length(cyl)){

  min_obs_cyl <- 100
  dat_cyl <- mtcars[cyl == as.numeric(cyl[i]) ]
  resampling[[  cyl[i]  ]] <- dat_cyl[sample(1:nrow(dat_cyl),
                                             size = (min_obs_cyl - nrow(mtcars[cyl == cyl[i] ])),
                                                 replace = T),]
}

resampling_df <- do.call("rbind", resampling)
mtcars_oversample <- rbind(mtcars, resampling_df)

我得到了307个观察结果。有人知道我做错了什么吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-15 22:26:07

我认为在这种情况下,您可以使用data.tableby=功能在组内进行抽样。sample来自每个cyl组内的.I行计数器,然后使用该行标识符从原始集合中分选择行:

代码语言:javascript
复制
mtcars[mtcars[, sample(.I, 100, replace=TRUE), by=cyl]$V1,]
#      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#  1: 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#  2: 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
#  3: 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
#  4: 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
#  5: 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
# ---                                                    
#296: 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
#297: 19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
#298: 19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
#299: 14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
#300: 15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3

如果您需要为每个组指定不同的计数,下面是一个选项。特殊的.BY对象将by=参数的值存储为列表。

代码语言:javascript
复制
grpcnt <- setNames(c(50,100,70), unique(mtcars$cyl))
#  6   4   8 
# 50 100  70 
mtcars[mtcars[, sample(.I, grpcnt[as.character(.BY[[1]])], replace=TRUE), by=cyl]$V1]
票数 2
EN

Stack Overflow用户

发布于 2018-10-15 22:20:58

对于另一种解决方案,您可以使用dplyr并执行以下操作:

代码语言:javascript
复制
library(dplyr)

mtcars %>%
    group_by(cyl) %>%
    do(sampled = sample_n(., size = 100, replace = TRUE)) %>%
    select(-cyl) %>%
    unnest()
票数 4
EN

Stack Overflow用户

发布于 2018-10-15 22:25:09

下面是另一种使用dplyr::slice的方法

代码语言:javascript
复制
mtcars %>%
  group_by(cyl) %>%
  slice(sample(n(), 100, replace = T)) %>%
  ungroup()
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52825412

复制
相关文章

相似问题

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