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

