如何基于分组经验分布为多列随机抽取值(R语言)
分组场景下基于经验分布抽取随机值的实现方法
首先修正你代码里的小错误,iris_new的正确写法是:
iris_new <- iris %>% select(Species)
核心思路
按Species分组后,为每个组匹配distributions中对应的经验分布表,使用sample函数结合分布表中的比例(n列)抽取随机值,最终合并到iris_new中生成随机化的特征列。
实现代码
1. 定义抽取函数
先写一个通用函数,用来从指定的经验分布表中按比例抽取指定数量的随机值:
sample_from_dist <- function(dist_tbl, n) { # dist_tbl是包含特征值和比例的tibble,n是需要抽取的数量 sample(dist_tbl[[1]], size = n, replace = TRUE, prob = dist_tbl$n) }
2. 批量生成随机化特征列
利用dplyr的分组和across函数批量处理四个特征列,避免重复代码:
library(dplyr) # 列出需要生成的特征列名 feature_cols <- c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width") iris_randomized <- iris_new %>% group_by(Species) %>% mutate( across(all_of(feature_cols), ~ sample_from_dist( # 匹配当前分组Species对应的经验分布表 distributions[distributions$Species == cur_group()$Species, .x][[1]], # 抽取数量等于当前组的行数 n() )) ) %>% ungroup()
结果验证
可以随机抽取一个物种,对比随机化后的分布和原经验分布是否一致:
# 查看setosa的Sepal.Length随机分布比例 iris_randomized %>% filter(Species == "setosa") %>% count(Sepal.Length) %>% mutate(prop = n / sum(n)) %>% arrange(Sepal.Length)
运行后会看到,随机化后的比例和distributions中setosa对应的Sepal.Length比例基本吻合。
内容的提问来源于stack exchange,提问作者MatSchu
相关产品推荐
相关产品推荐

