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

如何在R中使用pivot_longer将宽数据框转为长格式?

问题描述

需要将以下数据框转换格式,把Jan_2023、Feb_2023、Mar_2023三列替换为Date列和Value列,尝试用pivot_longer但未成功,请求帮助。

数据框代码:

Short_Name <- c("BE", "BE", "DE", "DE", "BE", "BE", "DE", "DE")
Long_Name <- c("BELGIUM", "BELGIUM", "GERMANY", "GERMANY", "BELGIUM", "BELGIUM", "GERMANY", "GERMANY")

Category <- c("Original", "Discount", "Original", "Discount","Original", "Discount", "Original", "Discount")

Jan_2023 <- c(100, 20, 90, 10, 120,40, 80, 25)
Feb_2023 <- c(110, 30, 90, 15, 150,40, 80, 15)
Mar_2023 <- c(120, 40, 90, 10, 130,40, 90, 10)

df_original <- data.frame(Short_Name, Long_Name, Category, Jan_2023, Feb_2023, Mar_2023)
解决方案

使用tidyr包的pivot_longer函数即可完成转换,核心是明确指定需要重塑的列以及新列的命名:

基础转换代码

library(tidyr)

df_long <- pivot_longer(df_original,
                        cols = c(Jan_2023, Feb_2023, Mar_2023), # 选中要转换的目标列
                        names_to = "Date", # 原列名存入新的Date列
                        values_to = "Value") # 原列对应数值存入新的Value列

可选:将Date列转为标准日期格式

如果需要把Date列的文本格式(如Jan_2023)转为可用于时间分析的标准日期类型,可以搭配lubridate包处理:

library(lubridate)

df_long <- df_long %>%
  mutate(Date = my(Date)) # my()函数自动识别"月_年"格式为日期

转换后的数据示例

转换完成后的数据框前5行结构如下:

Short_Name Long_Name Category Date     Value
  <chr>      <chr>     <chr>    <date>   <dbl>
1 BE         BELGIUM   Original 2023-01-01   100
2 BE         BELGIUM   Original 2023-02-01   110
3 BE         BELGIUM   Original 2023-03-01   120
4 BE         BELGIUM   Discount 2023-01-01    20
5 BE         BELGIUM   Discount 2023-02-01    30

内容的提问来源于stack exchange,提问作者4agreements

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:23:26