如何在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
相关产品推荐
相关产品推荐

