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