R中group_by后调用map结合mean_se计算分组均值标准误报错如何解决?
最优一步实现方案
直接使用dplyr::reframe() + across() 组合即可完成需求,无需提前移除分组列,也不用手动做数据透视,自动跳过非数值列避免报错,同时保留分组标识:
library(tidyverse) library(ggplot2) # 内置mean_se函数 iris %>% group_by(Species) %>% # dplyr 1.1.0及以上版本支持.unpack参数直接展开mean_se返回的结果 reframe(across(where(is.numeric), mean_se, .names = "{.col}"), .unpack = where(is.data.frame))
输出结果会自动生成分组列Species,以及每个数值变量对应的均值_y、均值减标准误_ymin、均值加标准误_ymax列,完全符合预期。
如果需要长格式结果(每个测量指标占一行),可以在上述代码后拼接pivot_longer()管道一步转换,不需要额外复杂处理。
原写法异常原因说明
group_by+map报错:map函数会遍历传入数据的所有列,包括因子类型的分组列,计算方差时触发因子输入的报错,且map本身无法识别dplyr的分组结构,不会按组分块计算。group_modify输出列过多:你用map_dfc遍历每个数值列调用mean_se,每个数值列会返回3个计算结果,4个数值列就会生成12个计算列,加上分组列总共13列,属于遍历维度错误。map_dfr的.id参数失效:.id是为输入的命名列表生成标识列,你传入的是未命名的列向量,自然无法生成正确的分组标识。
可选map类实现(仅做参考)
如果习惯用map逻辑,也可以先按组分格再计算,写法如下:
iris %>% nest(.by = Species) %>% mutate(res = map(data, ~map_dfr(.x, mean_se, .id = "measure"))) %>% unnest(res) %>% select(-data)
内容的提问来源于stack exchange,提问作者ibm
相关产品推荐
相关产品推荐

