我有一个数据框:
> 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)
- 这是否与分组有关?
答案 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()