假设以下数据帧:
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))
))
组 | 平均值(SD( | 中位数(IQR(|
---|---|---|
A | .29(.06( | .29(.25-.32( |
B | .51(.06( | .50(.47-.55( |
C | .21(.04( | .21(.18-.23( |