从 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
我有一个包含 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