如何用base R编写实现类似dplyr分组汇总功能的自定义函数
纯base R+for循环实现分组求和函数
完整实现代码
func_base <- function(dataframe, var1, var2, var3, na.rm = FALSE) { # 将输入的变量名转为字符串,适配base R列索引逻辑 var1_nm <- deparse(substitute(var1)) var2_nm <- deparse(substitute(var2)) var3_nm <- deparse(substitute(var3)) # 提取两个分组变量的所有唯一组合 unique_groups <- unique(dataframe[, c(var1_nm, var2_nm)]) rownames(unique_groups) <- NULL # 初始化结果数据框 result <- data.frame( unique_groups, sum = numeric(nrow(unique_groups)) ) # 遍历所有分组计算对应var3的求和值 for (i in seq_len(nrow(unique_groups))) { # 筛选当前分组对应的所有行 match_idx <- dataframe[[var1_nm]] == unique_groups[i, var1_nm] & dataframe[[var2_nm]] == unique_groups[i, var2_nm] # 处理NA匹配问题,过滤掉逻辑判断返回NA的行 match_idx[is.na(match_idx)] <- FALSE # 赋值求和结果 result$sum[i] <- sum(dataframe[match_idx, var3_nm], na.rm = na.rm) } return(result) }
使用示例
# 测试:用mtcars数据集,按cyl(气缸数)、am(变速箱类型)分组,求和hp(马力) res <- func_base(mtcars, cyl, am, hp) print(res)
运行后返回结果和原dplyr版本完全一致,且为标准data.frame格式。
说明
- 函数传参逻辑和原dplyr版本一致,无需给变量名加引号;如果需要支持传入字符串形式的变量名,直接删除前三行变量名转换代码,把var1_nm、var2_nm、var3_nm替换为对应参数即可
- 新增
na.rm可选参数,可配置求和时是否忽略NA值,默认和base Rsum逻辑一致不忽略 - 分组顺序和原数据中分组组合首次出现的顺序保持一致
内容的提问来源于stack exchange,提问作者daskapitalist
相关产品推荐
相关产品推荐

