Doppelt vorkommende Zeilen unterschiedlich markieren

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

Moderatoren: EDi, jogo

Antworten
benne
Beiträge: 12
Registriert: Mo Okt 08, 2018 1:42 pm

Doppelt vorkommende Zeilen unterschiedlich markieren

Beitrag 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
Ein Freund ist jemand, der sich deinen Müll anhört, dir sagt dass es Müll ist und trotzdem weiter zuhört.
Robin Williams
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Doppelt vorkommende Zeilen unterschiedlich markieren

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
benne
Beiträge: 12
Registriert: Mo Okt 08, 2018 1:42 pm

Re: Doppelt vorkommende Zeilen unterschiedlich markieren

Beitrag 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
Ein Freund ist jemand, der sich deinen Müll anhört, dir sagt dass es Müll ist und trotzdem weiter zuhört.
Robin Williams
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Doppelt vorkommende Zeilen unterschiedlich markieren

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