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

R 如何按组从动态选择的行开始向下滚动列值?,r,data.table,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], d

这段代码生成了我的数据集的一个小近似值

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)
}
这实现了预期的结果,但不是以实际的方式 对于较大的数据集

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]

理想的解决方案将执行任务,将位置不等于零的日期子集为dates>第一个日期,同时按股票分组。

我认为这应该做到:

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))
库(nlme)

find.pos我认为您可以创建一个键/值数据集,然后进行联接我认为这是可能的,使用联接,但是如何引用每个股票的日期,这些日期仅大于位置不等于零的日期?ie 2012-01-04/2012-01-10适用于SPY,2012-01-06/2012-01-10适用于IBM。在非equi联接中,可能存在,即
dt[newdt,position:=pos,on=(stock,date>dates),by=.EACHI]
其中
pos
dates
是“newdt”键/值数据中的列
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))