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

如何从tibble的dist类型列提取mu和sigma并转为dataframe

提取正态分布中的mu和sigma值到DataFrame

我有如下tibble:

head(dd,2)

# A tibble: 10 × 4
   .model          yemo         GPRT .mean
   <chr>          <mth>       <dist> <dbl>
 1 ARIMA(GPRT) 2024 Dec  N(136, 854)  136.
 2 ARIMA(GPRT) 2025 Jan N(136, 1225)  136.

其结构如下:

str(dd)

fbl_ts [10 × 4] (S3: fbl_ts/tbl_ts/tbl_df/tbl/data.frame)
 $ .model: chr [1:10] "ARIMA(GPRT)" "ARIMA(GPRT)" "ARIMA(GPRT)" "ARIMA(GPRT)" ...
 $ yemo  : mth [1:10] 2024 Dec, 2025 Jan, 2025 Feb, 2025 Mar, 2025 Apr, 2025 May, 2025 Jun, 2025 Jul, 2025 Aug, 2025 Sep
 $ GPRT  : dist [1:10] 
  ..$ :List of 2
  .. ..$ mu   : num 136
  .. ..$ sigma: num 29.2
  .. ..- attr(*, "class")= chr [1:2] "dist_normal" "dist_default"
  ..$ :List of 2
  .. ..$ mu   : num 136
  .. ..$ sigma: num 35
  .. ..- attr(*, "class")= chr [1:2] "dist_normal" "dist_default"
  ..$ :List of 2
  .. ..$ mu   : num 136
  .. ..$ sigma: num 37.4
  .. ..- attr(*, "class")= chr [1:2] "dist_normal" "dist_default"
  ..$ :List of 2
  .. ..$ mu   : num 135
  .. ..$ sigma: num 38.5
  .. ..- attr(*, "class")= chr [1:2] "dist_normal" "dist_default"
  ..$ :List of 2
  .. ..$ mu   : num 135
  .. ..$ sigma: num 39.1
  .. ..- attr(*, "class")= chr [1:2] "dist_normal" "dist_default"
  ..$ :List of 2
  .. ..$ mu   : num 135
  .. ..$ sigma: num 39.5
  .. ..- attr(*, "class")= chr [1:2] "dist_normal" "dist_default"
  ..$ :List of 2
  .. ..$ mu   : num 135
  .. ..$ sigma: num 39.7
  .. ..- attr(*, "class")= chr [1:2] "dist_normal" "dist_default"
  ..$ :List of 2
  .. ..$ mu   : num 135
  .. ..$ sigma: num 39.9
  .. ..- attr(*, "class")= chr [1:2] "dist_normal" "dist_default"
  ..$ :List of 2
  .. ..$ mu   : num 135
  .. ..$ sigma: num 40.1
  .. ..- attr(*, "class")= chr [1:2] "dist_normal" "dist_default"
  ..$ :List of 2
  .. ..$ mu   : num 135
  .. ..$ sigma: num 40.2
  .. ..- attr(*, "class")= chr [1:2] "dist_normal" "dist_default"
  ..@ vars: chr "GPRT"
 $ .mean : num [1:10] 136 136 136 135 135 ...

我尝试了以下代码查看分布:

dd$GPRT[1:10]
<distribution[10]>
 [1] N(136, 854)  N(136, 1225) N(136, 1396) N(135, 1482) N(135, 1530) N(135, 1559) N(135, 1579) N(135, 1595) N(135, 1608)
[10] N(135, 1619)

我的目标是提取所有的mu和sigma值并放入一个dataframe中,但不确定怎么从这些正态分布里提取数值。


解决方案

从str(dd)的输出能看到,GPRT列的每个元素都是包含mu和sigma的列表,可用以下方法提取:

方法1:使用purrr::map_dfr

library(purrr)
dist_params <- map_dfr(dd$GPRT, ~data.frame(mu = .x$mu, sigma = .x$sigma))

该方法会直接将每个分布的参数提取并整合成DataFrame。

方法2:基础R实现

如果不想加载额外包,用基础R的sapply即可:

mu_values <- sapply(dd$GPRT, function(x) x$mu)
sigma_values <- sapply(dd$GPRT, function(x) x$sigma)
dist_params <- data.frame(mu = mu_values, sigma = sigma_values)

额外注意

输出的N(mean, variance)中第二个值是方差,而提取的sigma是标准差(例如第一个分布N(136,854),29.2²≈854)。如果需要方差,可添加计算:

dist_params$variance <- dist_params$sigma^2

内容的提问来源于stack exchange,提问作者nickcox896

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 14:04:53