R语言计算分组列非NA时对应体重身高的均值、极差等汇总统计量
R实现多分组指标汇总统计方案
tidyverse 实现(推荐)
直接通过长表转换+分组汇总即可实现需求,代码逻辑清晰易读:
library(tidyverse) # 示例数据 dt <- tibble( group1 = c(1, 1, NA, NA, NA, NA), group2 = c(NA, NA, 2, 2, NA, NA), group3 = c(NA, NA, NA, NA, 3, 3), weight = c(3, 2, 3, 5, NA, 7), height = c(10, NA, 14, 15, 11, 20) ) # 统计代码 dt %>% # 转换为长表,自动过滤分组列NA值 pivot_longer(cols = starts_with("group"), names_to = "group", values_to = "group_val", values_drop_na = TRUE) %>% # 按分组汇总 group_by(group) %>% summarise( weight_mean = mean(weight, na.rm = TRUE), weight_range = max(weight, na.rm = TRUE) - min(weight, na.rm = TRUE), height_mean = mean(height, na.rm = TRUE), height_range = max(height, na.rm = TRUE) - min(height, na.rm = TRUE) )
运行输出结果:
# A tibble: 3 × 5 group weight_mean weight_range height_mean height_range <chr> <dbl> <dbl> <dbl> <dbl> 1 group1 2.5 1 10 0 2 group2 4 2 14.5 1 3 group3 7 0 15.5 9
base R 实现
不需要加载第三方包,用循环即可完成计算:
groups <- c("group1", "group2", "group3") res <- data.frame() for (g in groups) { sub_data <- dt[!is.na(dt[[g]]), ] res <- rbind(res, data.frame( group = g, weight_mean = mean(sub_data$weight, na.rm = TRUE), weight_range = diff(range(sub_data$weight, na.rm = TRUE)), height_mean = mean(sub_data$height, na.rm = TRUE), height_range = diff(range(sub_data$height, na.rm = TRUE)) )) } res
两种实现的计算结果完全一致,符合要求的计算规则:
- 仅保留对应分组列非NA的行参与统计
- 统计时自动跳过体重、身高为NA的样本
- 输出每个分组的体重、身高的均值和极差
内容的提问来源于stack exchange,提问作者Gabriella
相关产品推荐
相关产品推荐

