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

R语言:如何按双因子变量聚合数据框并对指定列求和?

解决方案:按双因子聚合并转宽格式

嗨,你完全不用手动构造目标数据框哦!这里有几种简洁的方法可以帮你轻松实现需求,而且还能顺便处理掉原始数据里region列大小写不一致的小问题(比如north和North会被当成不同类别,得先统一格式)。

首先先还原你的原始数据:

df <- data.frame(
  home=c("A","B","C","A","C"),
  weight=c(0.1,0.25,0.36,0.14,0.2),
  region=c("north","south","east","North","south"),
  stringsAsFactors = FALSE
)

第一步:统一region列的大小写

这一步很关键,不然大小写不同的同区域会被当成不同分组:

# 用stringr包快速转首字母大写(也可以用base R实现)
library(stringr)
df$region <- str_to_title(df$region)

方法1:用dplyr + tidyr(最直观的tidyverse风格)

先分组求和,再转成宽格式,缺失的组合自动填充0:

library(dplyr)
library(tidyr)

final_result <- df %>%
  # 按home和region分组,对weight求和
  group_by(home, region) %>%
  summarise(total_weight = sum(weight), .groups = "drop") %>%
  # 转宽格式,指定列名来源、值来源,缺失值填0
  pivot_wider(names_from = region, values_from = total_weight, values_fill = 0)

print(final_result)

输出结果就是你想要的:

# A tibble: 3 × 4
  home  North South  East
  <chr> <dbl> <dbl> <dbl>
1 A      0.24  0     0   
2 B      0     0.25  0   
3 C      0     0.2   0.36

方法2:用reshape2包的dcast(经典数据重塑工具)

先聚合求和,再用dcast直接转宽:

library(reshape2)

# 先按双因子聚合求和
aggregated_df <- aggregate(weight ~ home + region, data = df, sum)
# 转宽格式,fill=0填充缺失值
final_result <- dcast(aggregated_df, home ~ region, value.var = "weight", fill = 0)

print(final_result)

方法3:用base R的xtabs(无需额外包,一步到位)

用交叉表函数直接生成聚合结果,再转成数据框:

# 生成交叉表,自动按home和region聚合求和
cross_table <- xtabs(weight ~ home + region, data = df)
# 转成数据框矩阵
final_result <- as.data.frame.matrix(cross_table)
# 把行名转成单独的home列,调整列顺序
final_result$home <- rownames(final_result)
final_result <- final_result[, c("home", "North", "South", "East")]
rownames(final_result) <- NULL

print(final_result)

这几种方法都能完美得到你期望的结果,不用手动去构造数据框哦~

内容的提问来源于stack exchange,提问作者Aurélien

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:11:27