2017-02-03 1 views
0

Этот код генерирует небольшое приближение моего набора данных.Как сбросить значение столбца вниз, начиная с динамически выбранной строки, по группе?

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

В моем наборе данных, который> 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] 

Искомое решение будет выполнять задачу по Подменю датам> первый день, когда позиция не равна нулю, в то время как группировка по акции.

+1

Я думаю, что вы можете создать ключ/значение набора данных, а затем сделать объединение – akrun

+0

Я думаю, что это возможно с помощью объединений, но как я могу ссылаться на даты для каждого акции, которые больше, чем дата, когда позиция не равна нулю? т.е. 2012-01-04/2012-01-10 для SPY и 2012-01-06/2012-01-10 для IBM. – JHall651

+0

В объединениях без экви, это возможно, т. Е. 'Dt [newdt, position: = pos, on =. (Акции, дата> даты), by = .EACHI]' где 'pos' и' date' являются столбцы в данных ключа/значения 'newdt' – akrun

ответ

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)) 
Смежные вопросы