如何使用purrr重塑stats::simulate函数的输出为宽格式数据框
生成宽格式模拟观测数据框
原代码与问题
需求是使用stats::simulate函数和purrr包生成宽格式的模拟观测数据框,初始代码如下:
library(tidyverse) mod <- lm(mpg ~ cyl + disp, data = mtcars) m_sim <- function(s) { stats::simulate(mod, nsim = 1, newdata = mtcars, seed = s) } df <- map_dfr(1:3, m_sim)
但这段代码会生成长格式结果,每个观测对应多行数据(每个模拟重复一行),示例查询结果:
df %>% rownames_to_column(var = "car") %>% dplyr::filter(str_sub(car, 1, 10) == "Datsun 710") #> car sim_1 #> 1 Datsun 710...3 23.53562 #> 2 Datsun 710...35 30.94046 #> 3 Datsun 710...67 26.87957
修改方案
核心是将行绑定改为列绑定,同时为每个模拟结果的列命名,确保列对应不同的模拟次数:
library(tidyverse) mod <- lm(mpg ~ cyl + disp, data = mtcars) m_sim <- function(s) { sim_result <- stats::simulate(mod, nsim = 1, newdata = mtcars, seed = s) # 为每个模拟结果的列命名,区分不同模拟次数 colnames(sim_result) <- paste0("sim_", s) sim_result } # 用map生成模拟结果列表,再列绑定为宽格式 df_sim <- map(1:3, m_sim) %>% bind_cols() %>% rownames_to_column(var = "car") # 验证输出 df_sim %>% filter(car == "Datsun 710")
期望输出
#> car sim_1 sim_2 sim_3 #> 1 Datsun 710 23.53562 30.94046 26.87957
内容的提问来源于stack exchange,提问作者nicholas
相关产品推荐
相关产品推荐

