如何按列名分组计算DataFrame/矩阵的均值和标准差(忽略NA)
解决方案
基础R实现
你之前的代码是按行维度计算统计量,要得到每个分组所有数值的整体均值和标准差,只需将同分组的多列数据拉平为一维向量后再计算即可,代码如下:
# 按列名拆分数据框 group_data <- split.default(df, names(df)) # 计算分组整体均值 sapply(group_data, function(x) mean(unlist(x), na.rm = TRUE)) # 输出: # sun sky # 3.170588 5.472727 # 计算分组整体标准差 sapply(group_data, function(x) sd(unlist(x), na.rm = TRUE)) # 输出: # sun sky # 2.677631 2.102423
核心逻辑:unlist()会把同分组的多列数据全部合并为一维向量,直接对该向量计算均值和标准差,得到的就是所有非NA值的整体统计量,和你给出的预期结果完全一致。
tidyverse实现
如果你习惯使用tidyverse生态的语法,也可以通过转长表后分组统计的方式实现:
library(dplyr) library(tidyr) df %>% pivot_longer(cols = everything(), names_to = "group", values_to = "val") %>% group_by(group) %>% summarise( mean = mean(val, na.rm = TRUE), sd = sd(val, na.rm = TRUE) ) # 输出: # # A tibble: 2 × 3 # group mean sd # <chr> <dbl> <dbl> # 1 sky 5.47 2.10 # 2 sun 3.17 2.68
内容的提问来源于stack exchange,提问作者Osidaksjdm W
相关产品推荐
相关产品推荐

