dplyr:样本量大于种群大小

时间:2015-11-10 11:59:03

标签: r dplyr

我有一个数据框:

> class(dataset)
[1] "grouped_df" "tbl_df"     "tbl"        "data.frame"
> dim(dataset)
[1] 64480    39

我想从

中抽取50.000个样本
> dataset %>% dplyr::sample_n(50000)

但一直给我错误

Error: Sample size (50000) greater than population size (1). Do you want replace = TRUE?

但是,例如有效:

> dim(dataset[1] %>% dplyr::sample_n(50000))
[1] 50000     1

那么为什么我的人口规模为(1) - 这是否与分组有关?

2 个答案:

答案 0 :(得分:5)

是的,它可能与分组有关。正如您从class(dataset)的输出中看到的那样,您的数据目前已经过分组(请注意grouped_df信息),而一个或多个群组显然观察的数量太少,无法替换50000个观测值。

要解决此问题,您可以在采样前取消组合数据:

dataset %>% ungroup() %>% sample_n(50000)

或者您可以替换样品:

dataset %>% sample_n(50000, replace = TRUE)

答案 1 :(得分:2)

不幸的是,dplyr不允许您将大组“采样”到给定大小,或者只使用组中的所有数据(如果它是一个小组) - 要么必须将所有数据采样到最小的组大小,要么采样最小的组更换组以“膨胀”到更大的尺寸。您可以通过以下方式定义自定义sample_n函数来解决此问题:

 ### Custom sampler function to sample min(data, sample) which can't be done with dplyr
 ### it's a modified copy of sample_n.grouped_df
 sample_vals <- function (tbl, size, replace = FALSE, weight = NULL, .env = parent.frame()) 
 {
   #assert_that(is.numeric(size), length(size) == 1, size >= 0)
   weight <- substitute(weight)
   index <- attr(tbl, "indices")
   sizes = sapply(index, function(z) min(length(z), size)) # here's my contribution
   sampled <- lapply(1:length(index), function(i) dplyr:::sample_group(index[[i]],  frac = FALSE, tbl = tbl, 
                                       size = sizes[i], replace = replace, weight = weight, .env = .env))
   idx <- unlist(sampled) + 1
   grouped_df(tbl[idx, , drop = FALSE], vars = groups(tbl))
 }

 samped_data = dataset %>% group_by(something) %>% sample_vals(size = 50000) %>% ungroup()