Hallo Regression,
Regression hat geschrieben: ↑Fr Sep 21, 2018 9:26 am
wie sieht der Syntax aus wenn ich eine Bedingte Anfrage habe die sich auf eine Teilmenge bezieht in einer data.table?
Sei hierzu folgenser Datensatz gegeben:
Code: Alles auswählen
Data_Sample<-data.table(c(0,-95,rep(-1,10)),c(rep(12,12)),c(rep(1,12)))
Nun soll falls -80>min(V1) & V2>10 gilt, die komplette Untermenge gelöscht werden, gruppierend nach V3.
Hab es wie folgt vergebends versucht :
Code: Alles auswählen
Data_Sample[, if(V2<10 & -80>min(V1, na.rm=TRUE) .SD[-c(1:.N)] else .SD , .(V3)]
immer daran denken: V1 ind V2 sind Vektoren. Dieser Code beinhaltet einen häufigen Anfängerfehler:
https://stackoverflow.com/questions/141 ... f-function
Code: Alles auswählen
Data_Sample[, if(V2<10 & -80>min(V1, na.rm=TRUE) .SD:=NULL else .SD , .(V3)]
enthält den gleichen Fehler:
das Programmablaufkonstrukt
if (...) ... kann in der Bedingung keine Vektoren verarbeiten. Deshalb beschreibe bitte, was Du mit Deiner Bedingung
-80>min(V1) & V2>10 meinst: soll die gesamte Gruppe gelöscht werden, wenn für mindestens eine Zeile/Beobachtung das zutrifft (
any(...)) oder wenn es für alle Zeilen/Beobachtungen zutrifft (
all(...))
Nochmal Klartext:
der Auslöser des Debakels ist der Vektor
V2.
V2 > 10 ist ein logischer Vektor mit gleicher Länge wie V2. Dagegen liefert
-80>min(V1) nur einen einzigen logischen Wert.
Bei der Operation
-80>min(V1) & V2>10 wirkt die
recycling-rule: der kürzere Vektor wird so oft wiederholt bis die Länge zu dem anderen Vektor passt.
Gruß, Jörg