sei folgender Datensatz gegeben:
Code: Alles auswählen
dt<-data.table(Level=c(100,100,100,98:3,100,100,99,98,2,2,2,1,1,0,100,100,99:87,100,100,100,98:3,100,100,99,98,97,2,2,2,1,1,0,100,98:85), Zykl=c(rep(1,109),rep(2,15),rep(1,110),rep(2,15)),ID= c(rep(1,124),rep(2,125)))
Nun möchte ich Ausreißer kurz vor dem Ende des Zyklus beseitigen. Hierzu habe ich folgende Funktion geschrieben:
(Womit ich noch nicht zufrieden bin da es eine while-Schleife beinhaltet, aber mir ist kein anderer Weg eingefallen, da ich i.A. nicht weiß wie lange der Außreißer andauert)
Code: Alles auswählen
outlier_deletion<-function(Maindata){
Maindata[,test_var:=ifelse(Level>90 & shift(Level,type = "lead")<10 , 1,0)]
if(max(Maindata$test_var, na.rm = TRUE)>0){i<-1}else{i<-0}
while (i==1) {
Maindata[,test_var:=ifelse(Level>90 & shift(Level,type = "lead")<10 , 1,0)]
if(max(Maindata$test_var, na.rm = TRUE)>0){i<-1}else{i<-0}
Maindata<-Maindata[test_var!=1]
Maindata[, Level_diff := Level - shift(Level)]
}
return(Maindata)
}
Code: Alles auswählen
dt1<-dt[ID==1]
dt2<-fake_flanc_deletion(dt1)
Code: Alles auswählen
dt<-dt[,fake_flanc_deletion(.SD),ID]
Die Recherche hat bislang kaum was ergeben, ich weiß dass ich j manipuliere und damit den Datensatz verändere, aber genau das ist ja auch gewollt. Nun Blockiert der .SD und ich weiß nicht wie ich es umgehen kann.Error in `[.data.table`(Maindata, , `:=`(test_var, ifelse(Level > 90 & :
.SD is locked. Using := in .SD's j is reserved for possible future use; a tortuously flexible way to modify by group. Use := in j directly to modify by group by reference.
Besten Dank für Eure Unterstützung im Voraus!