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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:05:43