如何在R语言数据透视表中添加类似Excel的子分类
在R中实现带子分类的类Excel数据透视表效果
需求说明
现有代码已实现按segment分组汇总数值并添加整体总计,但需要在segment列下添加position作为子分类,实现类似Excel数据透视表的层级展示效果。
用户提供的原始数据与现有代码
原始数据生成代码
df <- data.frame(segment=rep(c('A1', 'B2', 'C3', 'D4'), each=4), position=rep(c('G', 'F'), times=8), values=round(runif(16, 4, 20),0))
现有汇总代码(仅按segment汇总+总计)
dfa=df%>% group_by(segment)%>% summarise(total_values=sum(values))%>%{ x <- . bind_rows( x, summarise( x , across(where(is.numeric), ~ sum(.x, na.rm = TRUE)), across(where(is.character), ~"TOTAL") ) )}
实现子分类的解决方案代码
library(dplyr) # 1. 计算每个segment下各position的子分类合计 sub_category <- df %>% group_by(segment, position) %>% summarise(total_values = sum(values), .groups = "drop") # 2. 计算每个segment的小计 segment_summary <- df %>% group_by(segment) %>% summarise(position = "小计", total_values = sum(values), .groups = "drop") # 3. 计算整体总计 overall_summary <- df %>% summarise(segment = "TOTAL", position = "总计", total_values = sum(values)) # 4. 合并结果并处理层级显示(重复segment名称置空) final_result <- bind_rows(sub_category, segment_summary, overall_summary) %>% arrange(segment, position) %>% mutate(segment = ifelse(duplicated(segment), "", segment)) # 查看结果 print(final_result)
代码说明
- 拆分计算子分类合计、分组小计、整体总计三个部分,确保各层级数据准确
- 合并后通过
duplicated()函数将重复的segment名称置空,模拟Excel数据透视表中父分类仅显示一次、子分类缩进的视觉效果 - 结果按
segment和position排序,层级结构清晰
内容的提问来源于stack exchange,提问作者Leonardo Vill
相关产品推荐
相关产品推荐

