如何从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
相关产品推荐
相关产品推荐

