.SD Blockade lösen
Verfasst: Fr Sep 14, 2018 8:15 am
Guten morgen,
sei folgender Datensatz gegeben:
Dieser beinhaltet zwei ID die über mehrere Zyklen. Dabei läuft ein Zyklus von 100 bis 0 (Level) runter.
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)
Diese Funktion funktioniert zuverlässig, wenn ich es auf jedes ID einzeln anwende:
Wenn ich allerdings auf den gesamten Datensatz es tue:
kommt folgende Meldung raus:
Besten Dank für Eure Unterstützung im Voraus!
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!