如何创建与R中的向量成比例的随机样本



假设以下数据帧:

df <- data.frame(id = 1:6, value=c(10,20,10,20,30,10))
df
id value
1  1    10
2  2    20
3  3    10
4  4    20
5  5    30
6  6    10

我想把每个人随机分配到三组(A,B,C(中的一组。我想达到30%的比例进入A组,50%进入B组,20%进入C组。但我想根据值列来完成这项任务。换句话说,我想实现以下目标:

id value group
1  1    10     A
2  2    20     A
3  3    10     C
4  4    20     B
5  5    30     B
6  6    10     C

或者。。。

id value group
1  1    10     A
2  2    20     B
3  3    10     A
4  4    20     C
5  5    30     B
6  6    10     A

当然,在这个例子中,这些都是完美的解决方案。但随机分配应该尽可能接近给定比例的分组分配。因此,另一个例子如下:

df <- data.frame(id = 1:6, value=c(112,56,53,13,80,120))
df
id value
1  1   112
2  2    56
3  3    53
4  4    13
5  5    80
6  6   120

一个可能的任务是:

id value group
1  1   112     B
2  2    56     A
3  3    53     C
4  4    13     C    
5  5    80     A
6  6   120     B

在这种情况下,分配并不完美,但接近所需比例(A组:31.3%,B组:53.4%,C组:15.2%(

有什么方法可以在R中实现这一点吗?谢谢

我理解您的目标是,在分组分配后,您希望sum(value[group == "A"]) / sum(value)近似等于0.3"B"(0.5(和"C"(0.2(也是如此。如果是这样的话,你所要做的就是用这些概率权重分配组,而不需要做任何特殊的事情来考虑value。作为随机化的自然结果,value的总和将(平均(根据您的意愿进行振荡。外观:

library(tidyverse)
set.seed(1)
# 100-row example dataframe
df <- tibble(
id = 1:100,
value = sample(1:200, 100, replace = TRUE)
)
# simulate 100 sets of group assignments
sims <- map_dfr(
1:100,                              # iterate 100x
~ df %>% 
mutate(group = sample(
c("A", "B", "C"), 
size = 100, 
replace = TRUE, 
prob = c(.3, .5, .2))           # probability weights
) %>% 
group_by(group) %>%
summarize(prop = sum(value)) %>%  # compute `value` proportion
mutate(prop = prop / sum(prop))   # within each group
)
# central tendency & dispersion across simulations
sims %>% 
group_by(group) %>% 
summarize(across(
prop, 
list(mean, sd, median, ~ quantile(.x, .25), ~ quantile(.x, .75))
))
中位数(IQR(
平均值(SD(
A.29(.06(.29(.25-.32(
B.51(.06(.50(.47-.55(
C.21(.04(.21(.18-.23(

最新更新