Duplikate mit bestimmten Wert beseitigen

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

Duplikate mit bestimmten Wert beseitigen

Beitrag 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:

Code: Alles auswählen

dt1<-dt[!duplicated(dt$Value1==100), .SD, Value3 ]
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!
Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Re: Duplikate mit bestimmten Wert beseitigen

Beitrag 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!
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Duplikate mit bestimmten Wert beseitigen

Beitrag 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
Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Re: Duplikate mit bestimmten Wert beseitigen

Beitrag 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! :)
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Duplikate mit bestimmten Wert beseitigen

Beitrag 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
Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Re: Duplikate mit bestimmten Wert beseitigen

Beitrag 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 :D
Besten Dank :!: TOP :!:

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

Re: Duplikate mit bestimmten Wert beseitigen

Beitrag 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

Code: Alles auswählen

dt[Value1!=100|*]
Dass dt nur Werte von Value1 ungleich 100 sind. Anschlißend folgt ein "oder".
Aber ich verstehe die Semantik hinter dem folgenden Syntax nicht:

Code: Alles auswählen

 dt[*| dt[, is.na(shift(Value1)), Value3][,V1]]
Danke im Voraus :!:
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Duplikate mit bestimmten Wert beseitigen

Beitrag 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

Code: Alles auswählen

dt[Value1!=100|*]
Dass dt nur Werte von Value1 ungleich 100 sind. Anschlißend folgt ein "oder".
Aber ich verstehe die Semantik hinter dem folgenden Syntax nicht:

Code: Alles auswählen

 dt[*| dt[, is.na(shift(Value1)), Value3][,V1]]
Nun ist die Bedingung aber etwas komplexer:

Code: Alles auswählen

dt[Bedingung1 | Bedingung2]
Bedingung1 ist klar; für Bedingung2 müssen wir wieder einen logischen Vektor konstruieren:

Code: Alles auswählen

dt[, is.na(shift(Value1)), Value3][,V1]
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
Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Re: Duplikate mit bestimmten Wert beseitigen

Beitrag 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 :?:
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Duplikate mit bestimmten Wert beseitigen

Beitrag 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:

Code: Alles auswählen

dt[, rbind(.SD[1], .SD[Value1!=100]), Value3]
Gruß, Jörg
Antworten