Seite 1 von 2
Duplikate mit bestimmten Wert beseitigen
Verfasst: Mi Sep 12, 2018 2:07 pm
von Regression
Guten Tag zusammen,
ich suche nach einer Möglichkeit in einer gegebenen data.table Duplikate zu entfernen, aber nur für einen einzelnen Wert, alle anderen Duplikate werden benötigt.
Sei hierzu:
Code: Alles auswählen
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)))
In diesem Fall sollen nur Duplikate für Value1==100 entfernt werden, gruppiert nach Value3.
Mein Ansatz bislang:
dabei werden nur die Value1==100 Zeilen ausgegeben, was auch Sinn macht, aber mir fällt keine Möglichkeit an, das geschickt zu selektieren.
Ich Danke euch herzlich für eure Hilfe im Voraus!
Re: Duplikate mit bestimmten Wert beseitigen
Verfasst: Do Sep 13, 2018 7:27 am
von Regression
Hallo noch mal,
es hat sich erledigt. für diejenigen die vor dem gleichen Problem stehen:
Hab einen kurzen Workaroud vorgenommen:
Code: Alles auswählen
dt[, test_variable:=ifelse(Value1==100 & shift(Value1)==100,1,0), Value3]
dt<-dt[test_variable!=1]
Schönen Tag und frohes Schaffen, allerseits!
Re: Duplikate mit bestimmten Wert beseitigen
Verfasst: Do Sep 13, 2018 6:02 pm
von jogo
Hallo Regression,
in dem Ergebnis ist jetzt aber keine Zeile mehr mit Value1==100 - das habe ich mir anhand Deiner ursprünglichen Beschreibung anders vorgestellt. Wenn es das Ergebnis ist, was Du wolltest, ist alles in Ordnung und ich freue mich, dass Du das Problem lösen konntest.
Gruß, Jörg
Re: Duplikate mit bestimmten Wert beseitigen
Verfasst: Fr Sep 14, 2018 7:19 am
von Regression
Jörg besten Dank für Deine Anmerkung!
Das war selbstverständliche nicht gewollt.
Habe jetzt folgenden code dazwischen geschoben:
Code: Alles auswählen
dt[, test_variable:=ifelse(Value1==100 & shift(Value1)==100,1,0), Value3]
dt[,test_variable:=ifelse(is.na(test_variable),0,test_variable)] ### <-- geändert
dt<-dt[test_variable!=1]
So funktioniert es wie gewünscht!
Re: Duplikate mit bestimmten Wert beseitigen
Verfasst: Fr Sep 14, 2018 8:35 am
von jogo
gut, dann kann es ja jetzt an die Optimierung gehen:
Code: Alles auswählen
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]]
Regression hat geschrieben: ↑Fr Sep 14, 2018 7:19 am
Jörg besten Dank für Deine Anmerkung!
Das war selbstverständliche nicht gewollt.
Habe jetzt folgenden code dazwischen geschoben:
Code: Alles auswählen
dt[, test_variable:=ifelse(Value1==100 & shift(Value1)==100,1,0), Value3]
dt[,test_variable:=ifelse(is.na(test_variable),0,test_variable)] ### <-- geändert
dt<-dt[test_variable!=1]
So funktioniert es wie gewünscht!
Du weißt aber auch, dass die 100er-Werte ohne Lücke (je Value3-Gruppe) aufeinanderfolgen müssen, damit der Code das gewünschte Ergebnis liefert, richtig?
Gruß, Jörg
Re: Duplikate mit bestimmten Wert beseitigen
Verfasst: Fr Sep 14, 2018 2:16 pm
von Regression
Sehr schön, besten dank für die Optimierung !
Regression hat geschrieben: ↑Fr Sep 14, 2018 7:19 am
Du weißt aber auch, dass die 100er-Werte ohne Lücke (je Value3-Gruppe) aufeinanderfolgen müssen, damit der Code das gewünschte Ergebnis liefert, richtig?
Ja das ist in der Tat in diesem Fall so gewollt.
Aber in Kombination mit der von Dir Vorgeschlagenen Lösung bezügl. .SD Blockade erübrigt sich vermutlich dieser Fall
Besten Dank
TOP
FG
Regression
Re: Duplikate mit bestimmten Wert beseitigen
Verfasst: Di Sep 18, 2018 9:24 am
von Regression
Guten Morgen noch mal Jörg,
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:
Danke im Voraus
Re: Duplikate mit bestimmten Wert beseitigen
Verfasst: Di Sep 18, 2018 9:53 am
von jogo
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
Re: Duplikate mit bestimmten Wert beseitigen
Verfasst: Di Sep 18, 2018 10:12 am
von Regression
Sehr interessant- Danke!
Dh, mit der Bedingung1 werden erstamal alle werte ungleich 100 übergeben, aber mit der zweiten Bedinung wird das erste Aufkommen des Wertes 100 abgefangen.
Den Syntax werde ich versuchen noch wo anders einzubauen
----------
EDIT:
Gibt es auch eine Möglichkeit einen logischen Vektor aufzubauen, der nur den letzten Wert auf TRUE setzt
Re: Duplikate mit bestimmten Wert beseitigen
Verfasst: Di Sep 18, 2018 11:15 am
von jogo
ja, bei
shift() gibt es noch einen Parameter, mit dem man die Verschiebung in die andere Richtung bewirken kann.
Alternativ kann man auch immer prüfen, ob
dt[, .SD[.N], by=...] verwendet werden kann.
Zum Beispiel hätte man statt
Code: Alles auswählen
dt[Value1!=100 | dt[, is.na(shift(Value1)), Value3][,V1]]
auch sowas machen können:
Gruß, Jörg