多列分组汇总统计:dataframe、data.table与dplyr实现对比
泰坦尼克号数据分组汇总:base R与dplyr实现
以下是对应data.table分组汇总逻辑的base R和dplyr实现方案,先确保数据已读取为data.frame:
# 读取泰坦尼克号数据 titanic <- read.csv("titanic5.csv")
首先定义通用的辅助函数(和原案例一致,用于处理NA):
# 计算忽略NA的均值(0/1变量均值即为1的占比) mn <- function(x) mean(x, na.rm = TRUE) # 统计非NA值的数量 Nna <- function(x) sum(!is.na(x))
base R实现
按sex单变量分组汇总
使用aggregate函数实现分组计算,需展平返回的矩阵列以得到整洁的结果:
# 分组计算 agg_sex <- aggregate(survived ~ sex, data = titanic, FUN = function(x) c(Proportion = mn(x), N = Nna(x))) # 转换为标准data.frame格式 agg_sex_flat <- do.call(data.frame, agg_sex) colnames(agg_sex_flat) <- c("sex", "Proportion", "N") # 查看结果 agg_sex_flat
按sex+class多变量分组汇总
逻辑与单分组一致,仅需修改分组变量:
# 多分组计算 agg_sex_class <- aggregate(survived ~ sex + class, data = titanic, FUN = function(x) c(Proportion = mn(x), N = Nna(x))) # 转换为标准data.frame格式 agg_sex_class_flat <- do.call(data.frame, agg_sex_class) colnames(agg_sex_class_flat) <- c("sex", "class", "Proportion", "N") # 查看结果 agg_sex_class_flat
dplyr实现
先加载dplyr包,使用group_by+summarise的管道语法实现分组汇总:
library(dplyr)
按sex单变量分组汇总
titanic %>% group_by(sex) %>% summarise( Proportion = mn(survived), N = Nna(survived), .groups = "drop" # 取消分组状态,返回普通data.frame )
按sex+class多变量分组汇总
titanic %>% group_by(sex, class) %>% summarise( Proportion = mn(survived), N = Nna(survived), .groups = "drop" )
内容的提问来源于stack exchange,提问作者Thomas Philips
相关产品推荐
相关产品推荐

