如何高效重塑同时需宽转长与长转宽的DataFrame?
高效重塑数据框的R解决方案
原始数据复现
Names <- c(rep("A",5),rep("B",5), rep("C",5)) Types <- c(rep(c("Income","Tax Paid","Consumption","Stimulus","NonDurable expenses"),3)) year1 <- c(rep(c(1000,100,300,100,200),3)) year2 <- c(rep(c(2000,200,600,200,400),3)) year3 <- c(rep(c(4000,400,800,400,800),3)) df <- data.frame(Names,Types,year1,year2,year3)
高效实现代码
无需拆分数据框再合并,通过pivot_longer+pivot_wide的组合即可一步完成重塑,代码简洁且效率更高:
library(tidyr) library(dplyr) df_new <- df %>% # 将年份列转为纵向格式,生成year列和对应数值列 pivot_longer(cols = starts_with("year"), names_to = "year", values_to = "value") %>% # 将Types类别转为独立列,填充对应数值 pivot_wider(names_from = Types, values_from = value) %>% # 重命名列以匹配目标格式 rename(Tax = `Tax Paid`, NonDurable = `NonDurable expenses`) # 查看结果 head(df_new)
代码说明
pivot_longer:把year1/year2/year3三列折叠成year(存储年份标识)和value(存储对应年份数值)两列,保留Names和Types作为分组依据。pivot_wider:将Types中的每个类别(如Income、Tax Paid等)转为独立列,自动按Names和year分组对齐数据,用value填充对应位置的数值。rename:调整带空格的列名,完全匹配你需要的目标格式。
优势对比
你原方法需要多次筛选数据框、执行pivot_longer后再合并,不仅代码冗余,大数据量下效率极低,还存在行顺序错位导致数据匹配错误的风险。新方法仅通过两次pivot操作完成,代码更简洁,运行效率更高,数据对齐更可靠。
内容的提问来源于stack exchange,提问作者አብርሽ
相关产品推荐
相关产品推荐

