【发布时间】:2013-12-07 02:52:12
【问题描述】:
非常感谢您的评论/回答。
背景:我有一个包含十几个国家互换利率每日价格的大型数据表。这些列是 [ID, Date, X1Y, X2Y, X3Y ... X30Y],其中 X..Y 是表示收益率曲线部分的列(例如,X1Y 是 1 年期互换,X3Y 是 3 年期互换)。这两个键是ID(例如“AUD”、“GBP”)和Date(例如“2001-04-13”、“2001-04-16”)。
虚拟数据:
set.seed(123)
dt <- cbind(ID=rep(c("AUD","GBP"),c(100,100)),X1Y=rnorm(200),X2Y=rnorm(200),X3Y=rnorm(200))
dt <- data.table(dt)
dt[,Date := seq(from=as.IDate("2013-01-01"), by="1 day", length.out=100)]
setkeyv(dt,c("ID","Date"))
问题 1: 首先生成一些虚拟信号。如果有 100 列具有相当复杂的信号生成公式,在单独的函数中编码,比如 genSig(X1Y),那么语法是什么?这就是我只使用 3 列和一些无意义的公式的意思:
dt[,SIG1 :=c(0, diff(X1Y ,1)),by="ID"]
dt[,SIG2 :=c(0, diff(X2Y ,1)),by="ID"]
dt[,SIG3 :=c(0, diff(X3Y ,1)),by="ID"]
问题 2: 根据“月中”结转列。例如,使用 SIG 列,我想让每个月 15 日之后的所有内容都与 15 日的信号相同,直到下个月的 15 日。棘手的是,实际数据仅包含交易日,因此如果是周末/节假日,有些月份没有 15 日。另一个问题是使用有效的语法,我可以在每个月初使用循环(我知道..)来实现类似的东西,只是为了说明我的意思:
for (i in 2:length(dt$Date)){
if(as.POSIXlt(dt[i,]$Date)$mon == as.POSIXlt(dt[i-1,]$Date)$mon){
dt[i, SIG1 := dt[i-1,SIG1]]
dt[i, SIG2 := dt[i-1,SIG2]]
dt[i, SIG3 := dt[i-1,SIG3]]
}
}
我不知道如何处理“月中”问题,因为它可能在 15 日、16 日或 17 日发生。与问题 1 一样,如果有一种智能方法可以插入/更新多列/多列,将不胜感激。
【问题讨论】:
标签: r time-series data.table