You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

转换完成后的数据样例如下:

DateReturns
2020-01-010.14
2020-02-010.10
2020-03-01-0.09
2020-04-010.03
2020-05-010.01
2020-06-01-0.20
......

注意:如果需要日期为月末格式,只需要在生成Date列后做日期偏移即可,比如用lubridate::ceiling_date(Date, "month") - days(1)就能得到对应月份的最后一天。

内容的提问来源于stack exchange,提问作者Kgosi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 00:45:36