采样功能过采样

时间:2018-10-15 22:11:16

标签: r sample resampling

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

由于某些原因,我尝试了以下代码,但未产生300个观测值。

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个观察结果。有人知道我在做什么错吗?

3 个答案:

答案 0 :(得分:4)

对于其他解决方案,您可以使用dplyr并执行:

library(dplyr)

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

答案 1 :(得分:3)

这是使用dplyr::slice

的另一种方法
mtcars %>%
  group_by(cyl) %>%
  slice(sample(n(), 100, replace = T)) %>%
  ungroup()

答案 2 :(得分:2)

我认为在这种情况下,您可以使用data.table的{​​{1}}功能在组内进行采样。从每个by=组内的sample行计数器中.I,然后使用此行标识符从原始集中从子集中选择行:

cyl

如果您需要为每个组指定不同的计数,这是一个选项。特殊的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=