R中使用dplyr如何将行值转为列名实现聚合统计与归一化
实现方法
首先确保你已安装tidyverse套件(包含dplyr和tidyr两个核心包),未安装可先运行install.packages("tidyverse")。
1. 绝对数值统计结果
你可以结合tidyr包的pivot_wider()函数实现长表转宽表,缺失计数自动填充为0,代码如下:
library(tidyverse) # 从原始数据直接生成宽格式计数表 df_wide_count <- df %>% count(year, category) %>% pivot_wider( names_from = year, # 取year列的取值作为新列名 values_from = n, # 取统计得到的计数值填充单元格 values_fill = 0 # 无匹配项的单元格填充为0 )
运行后得到的结果结构如下:
| category | 2009 | 2010 | 2011 |
|---|---|---|---|
| A | 1 | 1 | 1 |
| B | 2 | 1 | 0 |
| C | 0 | 0 | 2 |
2. 按年份归一化的百分比版本
只需在统计计数后先按年份分组,计算单分类占当年总记录数的比例,再转宽表即可:
df_wide_pct <- df %>% count(year, category) %>% group_by(year) %>% # 计算百分比,可按需修改round()的第二个参数调整保留的小数位数,示例保留2位 mutate(pct = round(n / sum(n) * 100, 2)) %>% ungroup() %>% pivot_wider( id_cols = category, names_from = year, values_from = pct, values_fill = 0 )
运行后得到的百分比结果结构如下:
| category | 2009 | 2010 | 2011 |
|---|---|---|---|
| A | 33.33 | 50.00 | 33.33 |
| B | 66.67 | 50.00 | 0.00 |
| C | 0.00 | 0.00 | 66.67 |
内容的提问来源于stack exchange,提问作者Romy Schipper
相关产品推荐
相关产品推荐

