R中purrr::map_dfr计算列均值输出行而非列问题求解
问题说明
你遇到的map_dfr()输出格式不一致问题,核心是被迭代函数的返回值结构差异导致的:
- 用
quantile()计算分位数时,函数返回带固定名称的数值向量(比如计算2.5%分位时,返回值的名称固定为2.5%),map_dfr()按行绑定时会把所有同名结果归集到同一列,最终输出5行1列的长格式。 - 用
mean()计算均值时,函数返回无名称的单值,map_dfr()会默认用原数据框的列名(intercept、B1、B2等)作为输出列名,把每列的均值填入对应列,最终输出1行5列的宽格式,不符合后续合并的要求。
解决方案
推荐方案:一次性计算所有统计量(无需分步拼接)
不用分开计算均值、分位数再做合并,直接在每次迭代中返回固定列结构的单行结果,map_dfr()会自动按行拼接为你需要的三列tibble,代码最简洁也不容易出错:
library(tidyverse) beta_df %>% map_dfr(~ tibble( mean = mean(.x), `2.5%` = quantile(.x, 0.025, names = FALSE), `97.5%` = quantile(.x, 0.975, names = FALSE) ))
运行结果:
# A tibble: 5 × 3 mean `2.5%` `97.5%` <dbl> <dbl> <dbl> 1 -2.93 -3.08 -2.77 2 0.124 0.0311 0.255 3 0.156 -0.194 0.699 4 1.08 0.829 1.30 5 1.14 0.0592 2.07
输出行顺序和原数据框的列顺序完全对应,第一行为intercept列的统计量,第二到第五行依次为B1到B4列的统计量。
备选方案:单独生成均值列后再合并
如果你需要分步计算,只要在计算均值时强制指定统一的输出列名,避免map_dfr()自动用原列名生成宽表即可:
# 单独生成均值列 mean_col <- beta_df %>% map_dfr(~ tibble(mean = mean(.x))) # 和分位数结果按列合并 final_df <- bind_cols( mean_col, beta_df %>% map_dfr(quantile, 0.025), beta_df %>% map_dfr(quantile, 0.975) )
该方法得到的结果和推荐方案完全一致。
内容的提问来源于stack exchange,提问作者pgcudahy
相关产品推荐
相关产品推荐

