Seite 1 von 1
Doppelt vorkommende Zeilen unterschiedlich markieren
Verfasst: Mo Okt 08, 2018 3:07 pm
von benne
Hallo allerseits,
ich wage gerade den Einstieg in R und prompt kommt eine Kollegin mit einem Problem daher, das mir wie geschaffen für erste Experimente erscheint.
Vorgegeben ist eine Adressliste inklusive Geburtsdatum der Personen.
In seltenen Fällen kommt es dabei vor, dass zwei Personen mit dem gleichen Namen an einer Adresse wohnen.
Jetzt soll in die Tabelle noch ein Feld eingefügt werden, dass beim Älteren "sen." enthält und beim Jüngeren entsprechend "jun.".
Ausgangspunkt ist der Datensatz "personen".
Mit dem folgende Code-Schnipsel erzeuge ich mir den Datensatz "doppelte", der nur die Namen der betroffenen Personen enthält.
Code: Alles auswählen
doppelte<-cbind(personen, "doppelt" = duplicated(personen[c("Nachname","Vorname","Straße","Hausnummer","Zusatz")]))
doppelte<-subset(doppelte, doppelt == TRUE)[c("Nachname","Vorname"]
Auf Basis dieser Liste möchte ich nun im Ursprungsdatensatz "personen" ein Feld "Namenszusatz" einfügen, das die oben erwähnte Junior-Senior-Kennzeichnung enthält. Aber hier hakt es im Augenblick und ich könnte Hilfe gebrauchen.
Wie schon erwähnt, bin ich absoluter R-Neuling und dies ist mein erster Gehversuch.
Schönen Gruß
Benne
Re: Doppelt vorkommende Zeilen unterschiedlich markieren
Verfasst: Mo Okt 08, 2018 3:12 pm
von bigben
Hallo benne,
schön, dass Du hierher gefunden hast. Wenn ich jetzt versuchen wollte, eine Lösung für Dein Problem zu programmieren, woher weiß ich, wie die Zeile mit den Geburtsdaten heißt und in welchem Format das Datum vorliegt? Könnte wichtig sein für die Entscheidung, wer senior und wer junior ist. Wenn nun fünf von uns sich an einer Lösung versuchen würden, was wäre besser: Wenn Du einen Beispieldatensatz zum Austesten bereit stellst oder wenn jeder von den Fünf sich seinen eigenen Beispieldatensatz erstellt? Eben. Darum poste bitte zu solchen Fragen, die im Grunde gern gesehen sind, ein reproduzierbares Beispiel, hier mindestens einen Beispieldatensatz mit korrekter Spaltenbenennung und mit einer Darstellung des gewünschten Ergebnisses.
Kann es ganz selten auch mal sein, dass drei Leute die gleiche Adresse haben? Dann das bitte auch einflechten.
Gute Hinweise auch:
viewtopic.php?f=20&t=11
LG,
Bernhard
Re: Doppelt vorkommende Zeilen unterschiedlich markieren
Verfasst: Mo Okt 08, 2018 3:42 pm
von benne
Hallo Bernhard,
danke für die Hinweise.
Ich versuche dann mal die Struktur inkl. einiger Dummydaten wiederzugeben.
Die Adressliste umfasst die für diese Aufgabe relevanten Spalten:
Code: Alles auswählen
Nachname Vorname Geburtsdatum Strasse Hausnummer Zusatz
111174 Meier Anton 01.05.1937 Geierstr. 56
25844 Müller Frank 17.02.1954 Dalmatinerstr. 19
42561 Schmitz Michael 13.08.1974 Katzenstr. 267 C
44721 Meier Anton 30.10.1971 Geierstr. 56
In die Struktur soll jetzt eine neue Spalte eingefügt werden, die "JuniorSenior" heißt.
Der "Anton Meier" mit Geburtsdatum 01.05.1937 soll dann den Eintrag "sen." und der jüngere den Eintrag "jun." kriegen.
In allen anderen Datensätzen soll die Spalte leer bleiben, so dass die Tabelle anschließend wie folgt aussehen soll:
Code: Alles auswählen
Nachname Vorname Geburtsdatum Strasse Hausnummer Zusatz JuniorSenior
111174 Meier Anton 01.05.1937 Geierstr. 56 sen.
25844 Müller Frank 17.02.1954 Dalmatinerstr. 19
42561 Schmitz Michael 13.08.1974 Katzenstr. 267 C
44721 Meier Anton 30.10.1971 Geierstr. 56 jun.
Was die Anzahl der gleichnamigen Personen an einer Adresse angeht, da habe ich im konkreten Datensätze jeweils nur zwei Einträge.
Nach Rücksprache mit der Kollegin kam es bisher auch nie vor, dass mehr als zwei Personen mit demselben Namen an einer Adresse vorkamen.
Schönen Gruß
Benne
Re: Doppelt vorkommende Zeilen unterschiedlich markieren
Verfasst: Mo Okt 08, 2018 8:12 pm
von jogo
Hallo Benne,
willkommen im Forum!
Ich halte es für keine gute Idee, die Doubletten in einen extra Dataframe zu packen. Mein Ansatz geht dahin, eine neue Spalte im Dataframe zu erzeugen (oder vielleicht auch zwei Spalten), welche die Daten auseinander halten können.
Bei data.table gibt es die nette Funktion rleid(), mit der ich eine Lösung quasi im Kopf habe.
Das bringt mich natürlich auf die Idee, wie man das ohne zusätzliche Pakete löst:
Kernstück ist ave(), die Gruppierungsindizes sind Name und Adresse.
So, was soll ave() machen: bei Gleichheit in den Indizes eine fortlaufende Nummerierung erzeugen, also
seq_along(<einer der Gruppierungsindizes>)
achso: vorher nach Geburtsdatum sortieren (zeitlich richtig!) wäre nicht schlecht,
damit "sen." immer die Nummer 1 ist in der durch ave() generierten Variable.
Gruß, Jörg