.SD Blockade lösen

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Re: .SD Blockade lösen

Beitrag von Regression »

dt[, { print(.BY); ffdel(.SD)[, .N]}, .(Zykl, ID)]
Das hat mir sehr weiter geholfen!

hier ist das analoge Beispiel-Datensatz:

Code: Alles auswählen

dt<-data.table(Level=c(61:19,3,3,rep(2,3),1,1,3,3,2,2,2,1,1,1,0,0,99:34), Zykl=c(rep(1,60),rep(2,66)), ID=c(rep(1,126)))
Die Außreißer sind "zu klein"... Diesen Fall hatte ich noch nie gesehen. Wäre schön auch solche kleinen Außreißer zu eliminieren, allerdings
tuen mir diese nicht wirklich weh.

Danke vorab!
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: .SD Blockade lösen

Beitrag von jogo »

Hier mal meine Bastelei zu dem Thema:

Code: Alles auswählen

ffdel <- function(M) {
  up <- M[, Level<shift(Level, type="lead")]
  if (!any(up, na.rm=TRUE)) return(M)
  anfang <- 1+which(up)
  w <- M[, which(Level>90 &  shift(Level, type="lead")<10)]
  if (length(w)==0) return(M)  ### Variante 1 
  if (length(w)==0) ende <- M[, .N] else ende <- w  ### Variante 2 ab hier
  M[-(anfang:ende)]
}

dt[, { print(.BY); ffdel(.SD)[, .N]}, .(Zykl, ID)]
Mehr Diagnose gefällig?

Code: Alles auswählen

dt[, .(.N, L1=Level[1], Lmax=max(Level), Dmax=max(diff(Level)), Dmin=min(diff(Level))), .(Zykl, ID)]
Gruß, Jörg
Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Re: .SD Blockade lösen

Beitrag von Regression »

Sehr schön!
Ich danke Dir!!!
-----
EDIT: die #2Variante tut exakt das gewünschte :mrgreen:
Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Re: .SD Blockade lösen

Beitrag von Regression »

Mehr Diagnose gefällig?

Code: Alles auswählen
dt[, .(.N, L1=Level[1], Lmax=max(Level), Dmax=max(diff(Level)), Dmin=min(diff(Level))), .(Zykl, ID)]
*ThumbUp*
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: .SD Blockade lösen

Beitrag von jogo »

Die zweite Variante kann man noch etwas gefälliger gestalten:

Code: Alles auswählen

ffdel <- function(M) {
  up <- M[, Level<shift(Level, type="lead")]
  if (!any(up, na.rm=TRUE)) return(M)
  anfang <- 1+which(up)
  ende <- M[, which(Level>90 &  shift(Level, type="lead")<10)]
  if (length(ende)==0) ende <- M[, .N]
  M[-(anfang:ende)]
}
Gruß, Jörg
Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Re: .SD Blockade lösen

Beitrag von Regression »

Oh ich habe übersehen, dass die #2 Variante auch die letzten Datensätze abschneidet, also die Nullen :o
diese sind für mich essentiell :/
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: .SD Blockade lösen

Beitrag von jogo »

Regression hat geschrieben: Fr Sep 14, 2018 4:13 pm Oh ich habe übersehen, dass die #2 Variante auch die letzten Datensätze abschneidet, also die Nullen :o
diese sind für mich essentiell :/
Ja, Variante 2 ist recht radikal: vom Beginn der Flanke an wird alles Nachfolgende abgeschnitten.
Sollen die Zeilen, in denen Level den Wert 0 hat, erhalten bleiben? oder noch mehr?

Code: Alles auswählen

ffdel <- function(M) {
  up <- M[, Level<shift(Level, type="lead")]
  if (!any(up, na.rm=TRUE)) return(M)
  anfang <- 1+which(up)
  ende <- M[, which(Level>90 &  shift(Level, type="lead")<10)]
  if (length(ende)==0) ende <- M[, which(Level==0)[1]] - 1
  M[-(anfang:ende)]
}
Gruß, Jörg
Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Re: .SD Blockade lösen

Beitrag von Regression »

Hallo Jörg,

mir ist grade der letzte Datensatz wichtig, also, wann der Lebenszyklus zuende ist wichtig.
Dieser Endet nicht notwendigerweise mt einer Null.

LG
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: .SD Blockade lösen

Beitrag von jogo »

Hallo Regression,

Code: Alles auswählen

if (length(ende)==0) ende <- M[, .N] - 1
Gruß, Jörg
Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Re: .SD Blockade lösen

Beitrag von Regression »

Jap, perfekt :!:

Danke!
Antworten