此代码生成我的数据集的小近似值。
library(data.table)
stocks <- c("SPY","IBM","GOOG","ISRG")
dates <- seq(as.Date("2012-01-01"), by = "day", length.out = 10)
position <- 0
dt <- data.table()
for(i in 1:4){
tmp <- data.table(stock = stocks[i], date = dates, position = position)
dt <- rbind(dt,tmp)
}
在我的数据集中,&gt; 50GB,这些初始位置和日期通过子集以编程方式设置在一行中。下面的代码 只是举例说明在所需解决方案之前较大的集合的样子。
dt[stock == "SPY" & date == dates[4], position := 5]
dt[stock == "IBM" & date == dates[6], position := 10]
dt[stock == "GOOG" & date == dates[7], position := -10]
dt[stock == "ISRG" & date == dates[3], position := -8]
这实现了期望的结果,但不是以实际的方式 对于较大的数据集。
dt[stock == "SPY" & date > dates[4], position := 5]
dt[stock == "IBM" & date > dates[6], position := 10]
dt[stock == "GOOG" & date > dates[7], position := -10]
dt[stock == "ISRG" & date > dates[3], position := -8]
所需的解决方案将通过子集化到日期来执行任务&gt;位置不等于零的第一个日期,按库存分组。
答案 0 :(得分:0)
我认为应该这样做:
library(nlme)
find.pos<-function(dt){
initial<-subset(dt, position !=0)
dt$position<-ifelse(dt$date>initial$date,initial$position,dt$position)
return(dt)
}
Revised.df<-do.call(rbind.data.frame, gapply(dt, groups=dt$stock, FUN=find.pos))