在R中按多列汇总数据框且保留原行数的实现方法
问题与解决方案
问题场景
给定如下R语言数据:
x = c("a", "a", "a", "a", "b", "b") y = c("s", "s", "t", "t", "s", "s") z = c(1, 2, 3, 4, 5, 6) data = data.frame(cbind(x, y, z))
注:上述代码用cbind构造数据框时,会将数值型的z转换为字符型,实际使用建议直接写data = data.frame(x, y, z)以避免类型问题。
需求:按x和y两列分组,对z列求和,将求和结果作为新列w添加到原数据中,保留原数据所有行,不合并分组。正确的期望输出应为:
x y z w a s 1 3 a s 2 3 a t 3 7 a t 4 7 b s 5 11 b s 6 11
(注:原提问中的期望输出存在笔误,b对应的y列均为s,因此求和结果应为11而非5、6)
实现方法
方法1:使用dplyr包(tidyverse工具链)
这是分组处理最常用的直观方式,步骤如下:
library(dplyr) # 若之前用cbind构造数据,先将z转为数值型 data$z <- as.numeric(data$z) # 分组求和并添加新列 data <- data %>% group_by(x, y) %>% mutate(w = sum(z)) %>% ungroup() # 取消分组,避免后续操作受分组状态影响
方法2:使用base R(无需额外安装包)
利用base R的ave函数,它可按分组计算并返回与原向量长度一致的结果:
# 修正z的类型(若需要) data$z <- as.numeric(data$z) # 直接生成w列 data$w <- ave(data$z, data$x, data$y, FUN = sum)
内容的提问来源于stack exchange,提问作者LaTeXFan
相关产品推荐
相关产品推荐

