data.table + ifelse auf .SD bezogen

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

Moderatoren: EDi, jogo

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

data.table + ifelse auf .SD bezogen

Beitrag von Regression » Fr Sep 21, 2018 9:26 am

Hallo Zusammen,

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)]
oder

Code: Alles auswählen

Data_Sample[, if(V2<10 & -80>min(V1, na.rm=TRUE) .SD:=NULL else .SD , .(V3)]
Herzlichen Dank im Voraus!

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

Re: data.table + ifelse auf .SD bezogen

Beitrag von jogo » Fr Sep 21, 2018 9:40 am

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

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

Re: data.table + ifelse auf .SD bezogen

Beitrag von Regression » Fr Sep 21, 2018 10:05 am

Danke Dir Jörg!

gemeint war natürlich für any() :roll: :idea:

Damit funktioniert es wie gewünscht! :

Code: Alles auswählen

Data_Sample[, if(any(V2<10 & -80>min(V1, na.rm=TRUE))) .SD[-c(1:.N)] else .SD , .(V3)]
DANKE!!!

LG
Regression

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

Re: data.table + ifelse auf .SD bezogen

Beitrag von jogo » Fr Sep 21, 2018 10:09 am

Code: Alles auswählen

Data_Sample[, if (!(any(V2<10) & min(V1, na.rm=TRUE) < -80)) .SD , V3]
und auch das kann man noch umbauen bei Bedarf: !(A & B) id= (!A | !B) also

Code: Alles auswählen

Data_Sample[, if (all(V2>=10) | min(V1, na.rm=TRUE) >= -80) .SD , V3]

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

Re: data.table + ifelse auf .SD bezogen

Beitrag von Regression » Fr Sep 21, 2018 10:21 am

stimmt :!: an Morgan habe ich garnicht gedacht :oops:

Nochmals Danke!

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

Re: data.table + ifelse auf .SD bezogen

Beitrag von jogo » Fr Sep 21, 2018 10:30 am

Das ist ja auch nicht zwingend notwendig (dem Compi ist es egal), aber manchmal hilft so eine Umformung, die Logik der Bedingung klarer darzustellen.
- vielleicht ist das auch nur ein subjektiver Eindruck von mir.

Gruß, Jörg
Regression hat geschrieben:
Fr Sep 21, 2018 10:21 am
stimmt :!: an Morgan habe ich garnicht gedacht :oops:

Nochmals Danke!

Antworten