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
相关产品推荐
相关产品推荐

