R中使用dplyr多列分组汇总时如何按family字段去重
解决方案
首先明确原代码的两个可调整点:
- 原数据集列名为小写
family、inc,代码中大写开头的Family、Inc会触发列不存在报错,需要先统一列名大小写。 - dplyr中
summarise执行后会默认丢弃最后一层分组,你按family+type分组汇总后,剩余的分组层级为family,此时mutate计算的sum(Transaction_count)就是每个family的总交易数,符合占比计算逻辑。
如果你要每个family仅保留唯一一行,根据统计需求可以选择以下两种方案:
方案1:仅保留family维度的总统计量
如果不需要保留type维度的细分数据,直接按family单字段分组汇总即可:
library(dplyr) df <- df1 %>% group_by(family) %>% summarise( Transaction_count = n(), Face_value = sum(inc) )
输出结果每个family对应唯一一行,包含该family的总交易数、总金额。
方案2:保留type细分信息,转宽表实现单family一行
如果需要同时保留各type的交易数、占比、金额信息,可以用宽表格式把type的细分值转为列存储:
library(dplyr) library(tidyr) # 先按双维度分组统计 df_temp <- df1 %>% group_by(family, type) %>% summarise( Transaction_count = n(), Face_value = sum(inc), .groups = "drop_last" # 显式指定仅丢弃type层级分组,避免dplyr版本差异导致的警告 ) %>% mutate( total_count = sum(Transaction_count), total_facevalue = sum(Face_value), Pct = Transaction_count / total_count ) # 转宽表,每个family仅保留一行 df <- df_temp %>% pivot_wider( id_cols = c(family, total_count, total_facevalue), names_from = type, values_from = c(Transaction_count, Face_value, Pct), values_fill = 0 # 不存在的type对应统计值填0 )
内容的提问来源于stack exchange,提问作者Yomi.blaze93
相关产品推荐
相关产品推荐

