You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于分组经验分布为多列随机抽取值(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:08:12