R语言宽表转长表:含双时间变量的格式转换需求
解决方案(R语言宽表转长表)
首先构造你的示例数据:
df <- data.frame( CODE = c(1, 12, 8), NAME = c("A", "B", "C"), M_2010_1 = c(10, 11, 9), M_2011_1 = c(11, 13, 2), M_2012_1 = c(10, 15, 4), M_2010_3 = c(9, 15, 2), M_2011_3 = c(10, 14, 8), M_2012_3 = c(13, 11, 8) )
使用tidyr+dplyr的组合完成转换:
library(tidyr) library(dplyr) result <- df %>% # 将所有M_开头的列转为长格式,列名存入key,数值存入value pivot_longer(cols = starts_with("M_"), names_to = "key", values_to = "value") %>% # 拆分key列,按下划线分隔出前缀、年份、月份标识 separate(key, into = c("prefix", "YEAR", "month"), sep = "_") %>% # 将月份标识转为列名(M1、M3),对应填充数值 pivot_wider(names_from = month, values_from = value, names_prefix = "M") %>% # 整理列顺序并移除无用列 select(CODE, NAME, YEAR, M1, M3) %>% # 把YEAR转为整数类型(可选,按需调整) mutate(YEAR = as.integer(YEAR)) print(result)
运行后得到的结果与你期望的长格式完全一致:
CODE NAME YEAR M1 M3 1 1 A 2010 10 9 2 1 A 2011 11 10 3 1 A 2012 10 13 4 12 B 2010 11 15 5 12 B 2011 13 14 6 12 B 2012 15 11 7 8 C 2010 9 2 8 8 C 2011 2 8 9 8 C 2012 4 8
步骤说明
- pivot_longer:把宽表中所有年份-月份相关的列压缩成
key(列名)和value(数值)两列,为拆分年份、月份做准备。 - separate:从
key列中拆分出年份(YEAR)和月份标识(1/3),实现信息拆解。 - pivot_wider:把拆分后的月份标识转为并列的
M1、M3列,让同一年份的两个数值在同一行展示。 - select+mutate:调整列的顺序,并将YEAR转为整数类型,优化数据格式。
内容的提问来源于stack exchange,提问作者Tom H
相关产品推荐
相关产品推荐

