這個問題是這個問題here的后續問題
我有 6 個類別(階層),我希望在每個階層中以 10% 作為樣本。這樣做我采取:
var = c(rep("A",10),rep("B",10),rep("C",3),rep("D",5),"E","F");var
value = rnorm(30)
dat = tibble(var,value);
pop=dat%>%group_by(var)
pop
singleallocperce = slice_sample(pop, prop=0.1);
singleallocperce
結果:
# A tibble: 2 x 2
# Groups: var [2]
var value
<chr> <dbl>
1 A -1.54
2 B -1.12
但我希望即使在某些階層中,他們內部的人口無法達到 10% 的抽樣樣本,也需要至少進行一次觀察。正如前面已經回答的那樣,正確的方法是:
dat %>%
group_by(var) %>%
mutate(min = if_else(n() * 0.1 >= 1, n() * 0.1, 1),
random = sample(n())) %>%
filter(random <= min) |>
select(var, value)
但現在另外我想進行比例分配抽樣(即權重與每個階層的亞群成比例,例如對于 A,權重將為:10/30,對于 B:10/30,對于 C:3/30,D: 5/30 等,然后將權重 w_i 與層的子群相乘)如果子群不滿足該要求,則保持 1 個觀察的約束。
比例分配方案如下所述:
w = dat%>%group_by(var)%>%summarise(w= n()/nrow(.));w
dat%>%
group_by(var)%>%
summarise(Ni=n())%>%
left_join(w,by="var")%>%
mutate(sample_per_group=Ni*w)
結果
# A tibble: 6 × 4
var Ni w sample_per_group
<chr> <int> <dbl> <dbl>
1 A 10 0.333 3.33
2 B 10 0.333 3.33
3 C 3 0.1 0.3
4 D 5 0.167 0.833
5 E 1 0.0333 0.0333
6 F 1 0.0333 0.0333
列 sample_per_group 包含每組的樣本數(與子種群數成正比)。但我想保持 sample_per_group <1 的約束給我一個觀察結果。
如何使用 dplyr 包做到這一點?有什么幫助嗎?
uj5u.com熱心網友回復:
也許這應該作業
library(dplyr)
dat %>%
group_by(var) %>%
mutate(w = n()/nrow(.), w = if_else(w <= 0.2, 1, w)) %>%
group_modify(~ .x %>%
slice_sample(prop = first(.$w))) %>%
slice(if(first(w) == 1) 1 else row_number()) %>%
ungroup
-輸出
# A tibble: 10 × 3
var value w
<chr> <dbl> <dbl>
1 A 0.811 0.333
2 A 0.363 0.333
3 A 0.355 0.333
4 B 0.366 0.333
5 B -0.979 0.333
6 B -0.809 0.333
7 C -0.536 1
8 D 1.06 1
9 E 0.832 1
10 F 0.937 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/488572.html
上一篇:閃亮應用程式中的renderUI函式內的selectInput更新
下一篇:R按組用NA替換最后n個值
