如何按组动态选择的行开始向下滚动列值?

时间:2017-02-03 05:19:36

标签: r data.table

此代码生成我的数据集的小近似值。

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;位置不等于零的第一个日期,按库存分组。

1 个答案:

答案 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))