Hallo Regression,
ja, kein Problem. Grundgedanke ist die Indizierung mit einem logischen Vektor:
Code: Alles auswählen
library(data.table)
as.data.table(BOD)[sample(c(TRUE, FALSE), 6, repl=TRUE)]
Regression hat geschrieben: ↑Di Sep 18, 2018 9:24 am
könntest Du mir bitte Dein optimierten Code erklären?
jogo hat geschrieben: ↑Fr Sep 14, 2018 8:35 am
library(data.table)
dt<-data.table(Value1=c(100,100,10:1,100,100,5:1,rep(1,2)), Value2=c(1:21),Value3=c(rep(1,12),rep(2,9)))
dt[Value1!=100 | dt[, is.na(shift(Value1)), Value3][,V1]]
Du forderst mit
Dass dt nur Werte von Value1 ungleich 100 sind. Anschlißend folgt ein "oder".
Aber ich verstehe die Semantik hinter dem folgenden Syntax nicht:
Nun ist die Bedingung aber etwas komplexer:
Bedingung1 ist klar; für
Bedingung2 müssen wir wieder einen logischen Vektor konstruieren:
Der erste Teil ist das Arbeitstier:
dt[, is.na(shift(Value1)), Value3] - gruppiere nach
Value3 und berechne
shift(Value1) in jeder Gruppe (im Ergebnis ist der erste Wert jeweils NA).
is.na(...) führt also dazu, dass der erste Wert in jeder Gruppe TRUE ist und für alle anderen FALSE.
Das Arbeitstier liefert aber keinen Vektor sondern einen Datatable, in dem auch noch
Value3 vorhanden ist. Deshalb löst
...[, V1] die Ergebnisspalte raus und liefert diese als Vektor.
Gruß, Jörg