You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:07:14