如何用tidy/dplyr方法为长数据框各分组计算jackknife均值
基于dplyr的tidy实现方案
有两种常用实现方式,均无需重复执行多次代码,自动适配names列的全部分组计算jackknife均值:
方法1:数学简化版(效率最高)
利用jackknife均值的数学性质直接计算,无需显式遍历删行,性能最优:
library(tidyverse) mtcars_long_numeric_with_jackknife <- mtcars_long_numeric %>% # 按指标名称分组 group_by(names) %>% # 每组内计算单个样本的jackknife均值:(全组总和-当前样本值)/(组内总样本数-1) mutate(jackknife_mean = (sum(values) - values) / (n() - 1)) %>% ungroup()
方法2:逻辑对齐原循环版
和你写的for循环逻辑完全一致,显式执行每次删一行再算均值的操作:
mtcars_long_numeric_with_jackknife <- mtcars_long_numeric %>% group_by(names) %>% group_modify(~ { .x %>% mutate( jackknife_mean = purrr::map_dbl(1:nrow(.x), function(i) mean(.x$values[-i])) ) }) %>% ungroup()
两种方法的计算结果完全一致,如果需要绘制各指标的jackknife均值直方图,可以用分面实现:
ggplot(mtcars_long_numeric_with_jackknife, aes(x = jackknife_mean)) + geom_histogram(bins = 32, color = 'black', fill = 'lightblue') + facet_wrap(vars(names), scales = 'free_x')
内容的提问来源于stack exchange,提问作者hachiko
相关产品推荐
相关产品推荐

