在R语言中如何将含年份与13列的宽表转换为3列长表
在R语言中将宽格式表格转换为长格式表格
你需要的是把宽格式(年份+多月份列)的表格转换为长格式(年份、月份、数值三列),以下是两种常用实现方法:
先构造示例数据
先还原你提供的宽表数据,方便测试:
wide_df <- data.frame( 年份 = c(2000, 2001, 2002), "1" = c(0.1, 0.4, 0.7), "2" = c(0.5, 0.1, 0.3), "3" = c(0.8, 0.3, 0.6) )
方法1:使用tidyverse工具(推荐)
这是当前R语言数据处理的主流方式,代码直观易读:
# 首次使用先安装包 install.packages("tidyverse") # 加载包 library(tidyverse) # 执行转换 long_df <- wide_df %>% pivot_longer( cols = -年份, # 排除年份列,转换其余所有列 names_to = "月份", # 原列名存入"月份"列 values_to = "数值", # 原列值存入"数值"列 names_transform = list(月份 = as.integer) # 可选:把月份转成整数类型 ) # 查看转换结果 print(long_df)
方法2:使用Base R原生函数
不需要安装额外包,适合不想加载第三方库的场景:
# 执行转换 long_df_base <- reshape( wide_df, direction = "long", varying = names(wide_df)[-1], # 指定要转换的列(除年份外) v.names = "数值", # 数值列的名称 timevar = "月份", # 存储月份的列名 times = names(wide_df)[-1], # 月份的取值(原列名) idvar = "年份", # 分组依据列 new.row.names = 1:(nrow(wide_df)*length(names(wide_df)[-1])) ) # 可选:将月份转为整数,重置行名 long_df_base$月份 <- as.integer(long_df_base$月份) rownames(long_df_base) <- NULL # 查看转换结果 print(long_df_base)
两种方法都能得到你需要的三列长格式表格,根据自己的使用习惯选择即可。
内容的提问来源于stack exchange,提问作者Tugiyo
相关产品推荐
相关产品推荐

