r - 将季度数据转换为月度数据
问题描述
我得到了以下包含季度数据的数据表:
set.seed(1)
DT <- data.table(dates=c(as.Date("1983-03-31"), as.Date("1983-06-30"), as.Date("1983-09-30"),
as.Date("1983-12-31"), as.Date("1984-03-31"), as.Date("1984-06-30"),
as.Date("1984-09-30"), as.Date("1984-12-31"), as.Date("1985-03-31"),
as.Date("1985-06-30"), as.Date("1985-09-30")),
var=rnorm(11))
DT
# desired outout: (extract)
data.table(dates=c(as.Date("1983-01-31"), as.Date("1983-02-28"), as.Date("1983-03-31")),quarter=rep(as.Date("1983-03-31"),3),
var=rep(-0.6264538,3))
我想通过将相应月份的相应季度值复制 3 次,从季度数据集中创建一个月度数据集。必须首先创建相应的月份Date
格式,因为它们应该稍后在分析中使用。这可以通过某种连接轻松完成吗?我只找到了反之亦然的方法,即通过聚合从每月到每季度。
最好通过使用datatable
. 感谢您的任何提示。
解决方案
这是一个 data.table 选项,其中包含一些 lubridate 函数。也许有更直接的方法,但这也可能完成这项工作:
library(lubridate)
DT <- DT[rep(1:.N, each = 3)]
DT[, quarter := dates]
DT[, dates := {day(dates) <- 1; dates}]
DT[, dates := {month(dates) <- month(dates) - 1:(-1); dates}, by = quarter]
DT[, dates := dates -1]
我们首先将每一行复制三次。然后我们为季度创建日期列的副本。接下来,我们将日期设置为该月的第一天。然后我们从每个日期中减去 1、0、-1 个月,最后减去一天,得出上个月的最后一天。
head(DT)
# quarter var dates
# 1: 1983-03-31 -0.6264538 1983-01-31
# 2: 1983-03-31 -0.6264538 1983-02-28
# 3: 1983-03-31 -0.6264538 1983-03-31
# 4: 1983-06-30 0.1836433 1983-04-30
# 5: 1983-06-30 0.1836433 1983-05-31
# 6: 1983-06-30 0.1836433 1983-06-30
推荐阅读
- javascript - 在 graphql-yoga 服务器中使用中间件
- docker - 来自守护进程的错误响应:open \\.\pipe\docker_engine_linux: 系统找不到指定的文件
- reactjs - 反应:OSX 上的格式脚本问题
- python-2.7 - 使用 python 2 在 azure devops workitem 中上传 CSV 文件
- python - 压缩数据
- typescript - 将函数作为参数打字稿传递时避免两次参数定义
- python - 从数据帧为 keras 数据生成一个 numpy-ndarray
- html - 让我的 scrollIntoView 工作(总菜鸟)
- amazon-web-services - 发件人 ID 未显示 AWS SMS
- java - 获取 Maven 中使用的所有 3rd 方依赖项模块