You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效重塑同时需宽转长与长转宽的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)

代码说明

  1. pivot_longer:把year1/year2/year3三列折叠成year(存储年份标识)和value(存储对应年份数值)两列,保留Names和Types作为分组依据。
  2. pivot_wider:将Types中的每个类别(如Income、Tax Paid等)转为独立列,自动按Names和year分组对齐数据,用value填充对应位置的数值。
  3. rename:调整带空格的列名,完全匹配你需要的目标格式。

优势对比

你原方法需要多次筛选数据框、执行pivot_longer后再合并,不仅代码冗余,大数据量下效率极低,还存在行顺序错位导致数据匹配错误的风险。新方法仅通过两次pivot操作完成,代码更简洁,运行效率更高,数据对齐更可靠。

内容的提问来源于stack exchange,提问作者አብርሽ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:28:17