如何在Excel、R或Tableau中实现多级表头表格逆透视?
没问题!我来帮你把这个带多级表头的宽表转成你想要的长格式,下面分别说说Excel、R、Tableau的具体操作方法:
Excel 操作方法
- 先整理表头:你的原始表有两行表头(第一行是月份,第二行是状态),先在第三行生成合并后的列名,比如在A3单元格输入
=A1&"_"&A2,然后拖动填充到所有列,这样每列的名字就变成November_On-time、November_Not这种格式。 - 选中第三行到所有数据行(包括Firm列),点击「数据」选项卡的「从表格/区域」,把数据导入Power Query编辑器。
- 在Power Query里,选中
Firm列,然后点击「转换」选项卡的「逆透视其他列」,这时候会生成Attribute和Value两列。 - 选中
Attribute列,点击「转换」→「拆分列」→「按分隔符」,选择下划线_作为分隔符,分成两列,分别命名为Month和status。 - 最后把
Value列重命名为pct,调整列的顺序,关闭并上载到Excel,就得到你要的长格式表了。
R 操作方法
用tidyverse工具包的tidyr就能轻松搞定,步骤如下:
- 首先加载tidyverse:
library(tidyverse) - 读入你的数据(假设数据保存为csv文件,或者已经在R里生成了数据框
df),注意处理两行表头:# 读入时指定表头为前两行,然后合并列名 df <- read.csv("your_data.csv", header = FALSE) colnames(df) <- paste(df[1, ], df[2, ], sep = "_") # 去掉前两行表头数据,保留实际内容 df <- df[-c(1, 2), ] - 用
pivot_longer转成长格式:df_long <- df %>% pivot_longer( cols = -Firm, # 除了Firm列,其他列都要逆透视 names_to = c("Month", "status"), # 拆分后的列名 names_sep = "_", # 按下划线拆分原列名 values_to = "pct" # 数值列的名字 ) %>% # 可选:把status改成小写,和你示例里的on-time一致 mutate(status = tolower(status)) - 运行后
df_long就是你要的长格式数据了。
Tableau 操作方法
- 把数据导入Tableau后,在数据源界面,选中前两行表头,右键选择「合并字段」,这样每列的字段名会变成
November - On-time、November - Not这种格式。 - 选中所有合并后的字段(除了
Firm),右键选择「数据透视」,这时候会生成「透视字段名称」和「透视字段值」两个字段。 - 右键「透视字段名称」,选择「拆分」,Tableau会自动按分隔符(这里是破折号)拆分成
透视字段名称1和透视字段名称2,把它们分别重命名为Month和status。 - 把「透视字段值」重命名为
pct,然后把字段拖到视图里调整顺序,就得到长格式的结果了。
内容的提问来源于stack exchange,提问作者Christian R. Houen




