R语言中将月份列转换为行 生成Date和Returns两列数据
R语言宽表转长表实现方法
你手中的初始数据是按年为行、月份为列排布的宽格式收益率数据,可通过以下两种方式转换为仅含Date、Returns字段的长表,注意原始数据中收益率为字符型存储,转换时需同步修正数据类型避免后续计算出错。
方法一:tidyverse方案(代码简洁,日常分析首选)
需要用到tidyr、dplyr、lubridate三个包,代码逻辑清晰易读:
# 加载包,若未安装请先运行install.packages(c("tidyverse","lubridate")) library(tidyr) library(dplyr) library(lubridate) long_returns <- Returns_data %>% # 宽转长:将12个月份列转换为行存储 pivot_longer( cols = Jan:Dec, names_to = "month_abbr", values_to = "Returns" ) %>% mutate( # 拼接年份+月份缩写,生成标准日期(默认取每月1日为日期值) Date = ym(paste0(Year, month_abbr)), # 将字符型收益率转为数值型 Returns = as.numeric(Returns) ) %>% # 仅保留目标列,按日期升序排序 select(Date, Returns) %>% arrange(Date)
方法二:基础R方案(无需安装第三方包)
如果不想依赖外部扩展包,可以直接用R内置函数完成转换:
# 第一步:用reshape函数完成宽转长 long_data <- reshape( Returns_data, direction = "long", varying = 2:13, # 指定第2到13列为待转换的月份列 v.names = "Returns", timevar = "month", times = 1:12 ) # 第二步:生成日期列、修正收益率类型 long_data$Date <- as.Date(paste0(long_data$Year, "-", long_data$month, "-01")) long_data$Returns <- as.numeric(long_data$Returns) # 第三步:提取目标列、排序、清理行名 long_returns <- long_data[order(long_data$Date), c("Date", "Returns")] rownames(long_returns) <- NULL
转换完成后的数据样例如下:
| Date | Returns |
|---|---|
| 2020-01-01 | 0.14 |
| 2020-02-01 | 0.10 |
| 2020-03-01 | -0.09 |
| 2020-04-01 | 0.03 |
| 2020-05-01 | 0.01 |
| 2020-06-01 | -0.20 |
| ... | ... |
注意:如果需要日期为月末格式,只需要在生成Date列后做日期偏移即可,比如用lubridate::ceiling_date(Date, "month") - days(1)就能得到对应月份的最后一天。
内容的提问来源于stack exchange,提问作者Kgosi
相关产品推荐
相关产品推荐

