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

R语言实现矩阵归约:对相同行列名的观测值求和

R数据框按行/列同名分组求和实现

我有一个如下结构的方阵数据:

A <- c("111","111","111","112","112","113")
B <- c(100,10,20,NA,NA,10)
C <- c(10,20,40,NA,10,20)
D <- c(10,20,NA,NA,40,200)
E <- c(20,20,40,10,10,20)
F <- c(NA,NA,40,100,10,20)
G <- c(10,20,NA,30,10,20)

df <- data.frame(A,B,C,D,E,F,G)
names(df) <- c("Codes","111","111","111","112","112","113")

#   Codes 111 111 111 112 112 113
# 1   111 100  10  10  20  NA  10
# 2   111  10  20  20  20  NA  20
# 3   111  20  40  NA  40  40  NA
# 4   112  NA  NA  NA  10 100  30
# 5   112  NA  10  40  10  10  10
# 6   113  10  20 200  20  20  20

需要对该矩阵做归约处理,将行标识(Codes字段取值)、列名相同对应的观测值进行求和,期望得到如下结果:

#   Codes 111 112 113
# 1   111 230 120  30
# 2   112  50 130  40
# 3   113 230  40  20

尝试先合并Codes字段取值相同的行时遇到较多问题,无法顺利达成目标。


实现方法

方法1:基础R实现(无额外依赖)

不需要安装第三方包,直接按行列分组聚合即可,求和时注意加na.rm = TRUE跳过空值:

# 提取唯一的行分组、列分组
row_cat <- unique(df$Codes)
col_cat <- unique(names(df)[-1])

# 初始化结果表
result <- data.frame(Codes = row_cat)
for (cc in col_cat) {
  result[[cc]] <- sapply(row_cat, function(rv) {
    sum(df[df$Codes == rv, names(df) == cc], na.rm = TRUE)
  })
}

运行后输出和预期完全一致:

Codes 111 112 113
1   111 230 120  30
2   112  50 130  40
3   113 230  40  20

方法2:tidyverse实现(长转宽聚合逻辑)

如果日常使用tidyverse生态,代码更简洁:

library(tidyverse)

df %>%
  pivot_longer(cols = -Codes, names_to = "col_group") %>%
  group_by(Codes, col_group) %>%
  summarise(total = sum(value, na.rm = TRUE), .groups = "drop") %>%
  pivot_wider(names_from = col_group, values_from = total)

内容的提问来源于stack exchange,提问作者A. Handler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:42:29