У меня есть данные в виде data.table приведенного нижеКомплексный алгоритма в R с использованием data.tables предыдущих строк значения
structure(list(atp = c(1, 0, 1, 0, 0, 1), len = c(2, NA, 3, NA,
NA, 1), inv = c(593, 823, 668, 640, 593, 745), GU = c(36, 94,
57, 105, 48, 67), RUTL = c(100, NA, 173, NA, NA, 7)), .Names = c("atp",
"len", "inv", "GU", "RUTL"), row.names = c(NA, -6L), class = c("data.table",
"data.frame"), .internal.selfref = <pointer: 0x0000000000320788>)
мне нужно, чтобы сформировать 4 новых столбцы csi_begin, csi_end, IRQ и csi_order , значение csi_begin и csi_end, когда atp = 1 напрямую зависит от значений inv и gu.
Но когда АТП не равен 1 csi_begin и csi_end зависит от INV и гу значений и значение IRQ из предыдущего ряда Значение IRQ зависит от csi_order этой строки, если АТП == 1 еще 0 и его значение зависит csi_order в двух строках предыдущего значения csi_begin.
Я написал условие с помощью цикла for. Ниже приведен код, указанный
lostsales<-function(transit)
{
if (transit$atp==1)
{
transit$csi_begin[i]<-(transit$inv)[i]
transit$csi_end[i]<-transit$csi_begin[i]-transit$GU[i]
}
else
{
transit$csi_begin[i]<-(transit$inv)[i]+transit$IRQ[i-1]
transit$csi_end[i]<-transit$csi_begin[i]-transit$GU[i]
}
if (transit$csi_begin[i-2]!= NA)
{
transit$csi_order[i]<-transit$csi_begin[i-2]
}
else
{ transit$csi_order[i]<-0}
if (transit$atp==1)
{
transit$IRQ[i]<-transit$csi_order[i]-transit$RUTL[i]
}
else
{
transit$IRQ[i]<-0
}
}
Может кто-нибудь помочь мне, как сделать эффективный цикл с использованием data.tables setkeys? Поскольку мой набор данных очень велик, и я не могу использовать для цикла иначе, время будет очень высоким.
У вас нет столбца с именем 'IRQ' в ваших данных, но он отображается в вашем примере/ –
Поскольку IRQ формируется по значению CSi_order else 0, когда atp! = 1 – user2786962
ОК, это имеет смысл, но посмотрите на свою сначала 'else'. Вы ссылаетесь на 'транзит $ IRQ', не создавая его ранее (' транзит $ csi_begin [i] <- (транзит $ inv) [i] + транзит $ IRQ [i-1] '). Поэтому я не вижу, как это может работать так, как написано. –