从 R 中的人口数据框抽样比例(分层抽样中的随机抽样)

Sampling a proportion from a population data frame in R (random sampling in stratified sampling)

我有一个包含 3 个组的数据框(人口)。 我要:

A) 取每个类别的 0.05% 和 B)每组取不同比例

我的数据框人口是:

category = c(rep("a",15),rep("b",30),rep("c",50))
num = c(rnorm(15,0,1),rnorm(30,5,1),rnorm(50,10,1))
pop = data.frame(category,num);pop

我正在考虑 dplyr 中的 sample_n() 函数,但我如何获取每个组的 0.05%?

在下面的代码中,我从每组中随机抽取 5 个元素。

pop%>%
  group_by(category)%>%
  sample_n(size = 5)

以及我如何更改道具分配,例如类别 a 为 0.05%,类别 b 为 0.1%,类别 c 为 20%?

您可以创建一个包含类别和各自比例的数据框,将其与 pop 连接并使用 sample_n 到每个组中的 select 行按其各自的比例。

library(dplyr)

prop_table <- data.frame(category = c('a','b', 'c'), prop = c(0.005, 0.001, 0.2))

pop %>%
  left_join(prop_table, by = 'category') %>%
  group_by(category) %>%
  sample_n(n() * first(prop)) %>%
  ungroup %>%
  select(-prop)

请注意,sample_n 已替换为 slice_sample,但 slice_sample 需要每个类别的固定 prop 值,并且不允许使用 first(prop) 之类的东西.

我们可以使用 slice_sample_n():

sample_n()sample_frac() 已被 slice_sample()

取代
library(dplyr)
slice_sample(pop, prop=0.05)
slice_sample(pop[pop$category =="a",], prop=0.05)
slice_sample(pop[pop$category =="b",], prop=0.1)
slice_sample(pop[pop$category =="c",], prop=0.2)
slice_sample(pop, prop=0.05)
  category       num
1        c 10.065583
2        c  9.715412
3        b  4.695062
4        a -1.799090
> slice_sample(pop[pop$category =="a",], prop=0.05)
[1] category num     
<0 rows> (or 0-length row.names)
> slice_sample(pop[pop$category =="b",], prop=0.1)
  category      num
1        b 5.595527
2        b 4.695062
3        b 6.123029
> slice_sample(pop[pop$category =="c",], prop=0.2)
   category       num
1         c  9.826321
2         c 10.682646
3         c  9.715412
4         c  9.871122
5         c 10.821703
6         c 10.890810
7         c 10.357713
8         c  9.579069
9         c 10.958487
10        c  9.939990