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

如何转换data.table格式:将日期价格表重构为月-日矩阵形式?

解决方法:将日期长表转成年月-日期宽表

没问题,这事儿用data.table的重塑功能就能轻松搞定,我给你一步步拆解实现步骤:

步骤1:拆分日期字段

首先我们需要从原有的date列里拆分出两个关键信息:

  • 年份-月份:作为结果表的行标识(第一列)
  • 日期的日部分:作为结果表的列名(从第二列开始的所有列)

我们可以用format()函数直接提取,或者用lubridate包的工具更便捷,代码如下:

library(data.table)
# 可选:lubridate处理日期更直观,也可以不用
library(lubridate)

# 你的示例数据
set.seed(123)
dt <- data.table(date = seq(as.Date('2020-01-01'), by = '1 day', length.out = 365), 
                 Germany = rnorm(365, 2, 1), 
                 check.names = FALSE)

# 添加年月列和日列
dt[, `:=`(
  year_month = format(date, "%Y-%m"), # 生成类似"2020-01"的年月字符串
  day = str_pad(day(date), 2, pad = "0") # 确保日是两位数字,比如"01"而非"1"
)]

步骤2:重塑数据为宽格式

接下来用data.table的dcast()函数把长格式数据转成你想要的宽格式,语法很简单:dcast(数据源, 行变量 ~ 列变量, value.var = 填充值的列名)

# 执行重塑
result_dt <- dcast(dt, year_month ~ day, value.var = "Germany")

# 查看结果前几行
head(result_dt)

关键说明

  • 原数据中的NA值会直接保留在结果表对应的单元格里,完全符合你的需求;
  • 如果后续有多个价格列(比如新增France、Italy等),只需要把value.var改成对应的列名向量即可,比如value.var = c("Germany", "France");
  • 用str_pad(day(date), 2, pad = "0")是为了让日列名统一为两位数字(比如"05"而非"5"),让列的排序更合理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:22:47