如何用apply函数或tidyverse优化马种身高体重模拟代码?
优化马种身高体重模拟代码
你的核心需求是避免重复编写每个马种的采样代码,同时能灵活调整采样数量。用tidyverse的工具可以轻松实现,这里提供两种简洁的方案:
方案1:使用purrr::map_dfr遍历行生成样本
library(tidyverse) horses_meas <- tribble( ~breed, ~mean_h, ~sd_h, ~mean_w, ~sd_w, "Hannover", 1.69, 0.10, 600, 25, "Arabian", 1.50, 0.05, 400, 45, "Holsteiner", 1.68, 0.05, 575, 125 ) # 定义每个马种的采样数量,可灵活调整 sample_n <- 20 # 遍历每一行,生成对应样本并合并成数据框 horses <- map_dfr(1:nrow(horses_meas), function(i) { bind_cols( breed = rep(horses_meas$breed[i], sample_n), weight = rnorm(sample_n, horses_meas$mean_w[i], horses_meas$sd_w[i]), height = rnorm(sample_n, horses_meas$mean_h[i], horses_meas$sd_h[i]) ) }) print(horses)
方案2:使用dplyr::rowwise + reframe(更直观的tidyverse风格)
library(tidyverse) horses_meas <- tribble( ~breed, ~mean_h, ~sd_h, ~mean_w, ~sd_w, "Hannover", 1.69, 0.10, 600, 25, "Arabian", 1.50, 0.05, 400, 45, "Holsteiner", 1.68, 0.05, 575, 125 ) sample_n <- 20 horses <- horses_meas %>% rowwise() %>% reframe( breed = breed, weight = rnorm(sample_n, mean_w, sd_w), height = rnorm(sample_n, mean_h, sd_h) ) print(horses)
优势说明
- 只需修改
sample_n就能统一调整所有马种的采样数量,也可以给每个马种单独设置采样数(比如在horses_meas里加一列n,然后用该列代替sample_n) - 完全避免了重复编写
type_i这类冗余代码,新增马种时只需在horses_meas里添加行即可,无需修改采样逻辑 - 保持了tidyverse的链式风格,代码可读性更高
内容的提问来源于stack exchange,提问作者Logos
相关产品推荐
相关产品推荐

