如何在R语言中创建二级数据透视表
在R中构建二级分组的数据透视表
没问题!我来帮你搞定R里的二级数据透视表~首先咱们得先把数据处理好,因为你的Sales列带$和逗号,得先转换成数值才能计算汇总。下面我用两种常用方法实现你要的效果:
第一步:数据预处理
先把你的示例数据读入并清洗Sales列:
# 加载需要的工具包 library(dplyr) library(scales) # 用来格式化金额 # 模拟你的原始数据(这里用你提供的中国/亚洲的部分数据) sales_data <- tibble( Country = rep("China", 36), Region = rep("Asia", 36), Sales = c("$109,680", "$141,165", "$77,516", "$154,060", "$38,597", "$125,985", "$91,850", "$90,513", "$51,710", "$53,283", "$77,352", "$5,534", "$6,645", "$135,301", "$176,095", "$146,270", "$54,665", "$62,111", "$64,390", "$30,197", "$132,397", "$165,454", "$113,084", "$40,922", "$161,574", "$16,753", "$54,616", "$117,857", "$193,862", "$23,478", "$16,135", "$103,860", "$72,478", "$45,570", "$81,337", "$174,224") ) # 清洗Sales列:去掉$和逗号,转成数值型 sales_data_clean <- sales_data %>% mutate(Sales = as.numeric(gsub("\\$|,", "", Sales)))
第二步:构建二级透视表(dplyr方法)
这个方法能完美实现你想要的“区域-国家”分层展示效果,区域汇总行在上,对应国家的明细行在下,且重复的区域名称会被空出:
# 1. 计算每个国家的销售额总和 country_totals <- sales_data_clean %>% group_by(Region, Country) %>% summarise(Total_Sales = sum(Sales), .groups = "drop") # 2. 计算每个区域的销售额总和(把区域名称同时放在Country列,方便合并) region_totals <- country_totals %>% group_by(Region) %>% summarise(Country = Region, Total_Sales = sum(Total_Sales), .groups = "drop") # 3. 合并数据并调整格式,模拟二级透视表样式 final_table <- bind_rows(region_totals, country_totals) %>% # 按区域排序,让区域汇总行排在对应国家行的前面 arrange(Region, desc(Country == Region)) %>% # 把重复的区域名称替换为空,让表格更清晰 mutate(Region = ifelse(duplicated(Region), "", Region)) %>% # 把销售额格式化为带$和千分位的样式 mutate(Total_Sales = dollar(Total_Sales, big.mark = ","))
运行后你会得到这样的结果:
| Region | Country | Total_Sales |
|---|---|---|
| Asia | Asia | $3,452,710 |
| China | $3,452,710 |
如果你的数据包含欧洲、南美等其他区域和对应国家,这个方法完全通用——只要原始数据里有Region和Country的对应关系,就能自动生成分层的汇总表。
简便替代方法:用janitor包快速生成
如果你想更省事,可以用janitor包的函数快速生成带汇总的分层表:
library(janitor) final_table_janitor <- sales_data_clean %>% # 按区域、国家分组计算总和 group_by(Region, Country) %>% summarise(Total_Sales = sum(Sales), .groups = "drop") %>% # 给每个区域添加总计行(可选) adorn_totals(where = "row", name = "区域总计") %>% # 格式化金额 mutate(Total_Sales = dollar(Total_Sales, big.mark = ","))
这个方法生成的表格会明确标注“区域总计”,适合需要更正式汇总的场景。
内容的提问来源于stack exchange,提问作者Daniel Almaraz
相关产品推荐
相关产品推荐

