将data.frame从宽格式转换为长格式(其他示例无帮助)
Hey there! 要帮你彻底解决宽表转长表的难题,我得先拿到几个关键细节:
- 你的当前宽表具体结构:最好用
dput(head(your_data))输出一段可复现的代码,这样我能精准复现你的数据; - 你期望的长表格式:比如哪些列是保留的标识符(比如ID、姓名这类不转的列),转完后新增的列名是什么(比如年份、指标名、对应数值);
- 你试过的具体代码:包括用了哪个包的
melt/reshape,参数怎么设置的——毕竟有时候只是参数没配对而已。
给你举个常见场景的例子,方便你对照:
假设你的宽表是这样的:
wide_df <- data.frame( ID = 1:3, Sales_2020 = c(100, 200, 300), Sales_2021 = c(150, 250, 350), Costs_2020 = c(50, 80, 100), Costs_2021 = c(60, 90, 120) )
期望转成这样的长表(同时拆分指标和年份):
long_df <- data.frame( ID = rep(1:3, 4), Metric = rep(c("Sales", "Sales", "Costs", "Costs"), each = 3), Year = rep(c(2020, 2021), each = 6), Value = c(100,200,300,150,250,350,50,80,100,60,90,120) )
那用tidyr::pivot_longer(现在R里更推荐的 tidyverse 工具)就能轻松搞定:
library(tidyr) long_df <- pivot_longer(wide_df, cols = -ID, # 除了ID之外的所有列都要转 names_to = c("Metric", "Year"), # 拆分原列名为两个新列 names_sep = "_", # 按下划线拆分原列名 values_to = "Value") # 数值存入Value列
如果习惯用reshape2::melt,也可以这么写:
library(reshape2) long_df <- melt(wide_df, id.vars = "ID", variable.name = "Metric_Year", value.name = "Value") # 拆分Metric_Year列 long_df <- separate(long_df, Metric_Year, into = c("Metric", "Year"), sep = "_")
你把你的具体数据和代码贴出来,我就能帮你定位问题啦!
内容的提问来源于stack exchange,提问作者Maximilian Becker
相关产品推荐
相关产品推荐

