Mergng von Datensätzen über Teilnehmer ID

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

Moderatoren: EDi, jogo

Antworten
kosa
Beiträge: 16
Registriert: Mo Sep 02, 2019 6:47 pm

Mergng von Datensätzen über Teilnehmer ID

Beitrag von kosa »

Hallo alle zusammen,

Ich würde gern meine Merging-Strategie optimieren. Ich habe bei einer Untersuchung eine Vorher und Nachher-Befragung durchgeführt und habe die Daten nun nach Teilnehmer-ID gematcht. Man verliert dabei natürlich eine Hand voll Daten, da es Personen gibt, die nur bei der Vorher- bzw. nur bei der Nachher-Befragung teilgenommen haben. Zudem kann man bei einer visuellen Inspektion der Teilnehmer-IDs stark vermuten, dass manche Daten aufgrund von Tippfehlern in der ID nicht gematcht werden konnten. Zum Beispiel gibt es bei der Vorher-Erhebung eine ID mit SAJM27 und bei der Nachher-Befragung eine ID mit SAJN27. Es gibt auch noch andere Varianten. Meine Frage wäre, wie ich R anleiten kann ID's, die sich nur in einem Buchstaben unterscheiden, dennoch zu matchen, wenn zum Beispiel Alter und Geschlecht trotzdem übereinstimmt.

Wie könnte ich zum Beispiel über das Schreiben einer Funktion mir alle Fälle ausgeben lassen, die hinsichtlich ihrer ID ähnlich genug sind und Alter und Geschlecht auch übereinstimmen und anschließend über eine if-Funktion automatisch mergen lassen kann, wenn bestimmte Kriterien erfüllt sind?

Kriterien:
1) Mindestens vier der sechs Buchstaben bzw. Ziffern stimmen überein und stehen an der richtigen Stelle (Reihenfolge) (Bsp.: SAJM27 --> SAIN27) und
2) mindestens einer des/der "falschen" Buchstabens/Ziffer stimmt wenigstens inhaltlich überein (z.B. SAJM27 --> SAJM02)
3) Alter (+- 1) und Geschlecht stimmen überein

Alternativ:
1) Mindestens drei der vier Buchstaben stimmen überein
2) Mindestens eine der zwei Ziffern stimmen überein
3) Alter (+-1) und Geschlecht stimmen überein

Wie kann ich das programmieren? Jeder Hinweiß wäre toll!

Kliene Anmerkung:
Das merging habe ich mit dem Befehl "merge" vorgenommen.

dat_all<- merge(dat1,dat2,by="ID", all=T) #Auflistung aller Daten, auch diejenigen, die sich nicht matchen lassen
dat<- merge(dat1,dat2,by="ID", all=F) #nur vollständige Datensätze (Teilnahme bei Vorher- und Nachher-Befragung; ohne Berücksichtigung von Tippfehlern)

Schonmal vielen Dank!

Benutzeravatar
EDi
Beiträge: 1062
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Mergng von Datensätzen über Teilnehmer ID

Beitrag von EDi »

Das könnte hilfreich sein: https://cran.r-project.org/web/packages/fuzzyjoin/README.html
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.

kosa
Beiträge: 16
Registriert: Mo Sep 02, 2019 6:47 pm

Re: Mergng von Datensätzen über Teilnehmer ID

Beitrag von kosa »

Danke! Ich schaue mir das gleich mal an :)

kosa
Beiträge: 16
Registriert: Mo Sep 02, 2019 6:47 pm

Re: Mergng von Datensätzen über Teilnehmer ID

Beitrag von kosa »

Ich habe mir das Packet nun mal angeschaut und glaube (anhand der Beschreibung), dass der Befehl stringdist_inner_join() am besten passen würde.

Beschreibung: Join two tables based on fuzzy string matching of their columns. This is useful, for example, in matching free-form inputs in a survey or online form, where it can catch misspellings and small personal changes.

Wenn ich folgenden Befehl ausführe:

Code: Alles auswählen

data <- stringdist_inner_join(dat1, dat2, by = c("ID", "ID"), max_dist=1)
funktioniert auch alles erstmal einwandfrei.

Wenn ich es jedoch richtig verstanden habe, dann erlaubt "max_dist = 1", dass sich ein Buchstabe bzw. Ziffer zwischen den beiden ID-Codes unterscheiden darf (bitte korrigiert mich, wenn ich da falsch liege). Da die ID-Codes teilweise recht ähnlich sind, kommt es dadurch zu Doppelungen, die ich gern vermeiden wollen würde.

Zum ersten Messzeitpunkt (t1) habe ich zum Beispiel Teilnehmer mit ID-Codes SAGW17 und HAGW17 und zum zweiten Messzeitpunkt (t2) gibt es nur den ID-Code SAGW17.

HAGW17 hat offensichtlich nicht mehr an der zweiten Messung teilgenommen.
R matched nun SAGW17 von t1 mit SAGW17 (t2). Das ist korrekt und gewollt.
R matched aber auch HAGW17 von t1 mit SAGW17 von t2. Das ist nicht gewollt.

Ich habe zu beiden Messzeitpunkten das Alter und das Geschlecht erfasst, worüber ich den Match-bedingungen nun zusätzlich steuern möchte. Ist es möglich in den Befehl:

Code: Alles auswählen

stringdist_inner_join(dat1, dat2, by = c("ID", "ID"), max_dist=1)
einzubauen, dass zwar die ID in beiden Tabellen sich hinsichtlich eines Buchstabens/Ziffer unterschieden darf, aber das Alter und Geschlecht übereinstimmen müssen?

Es wäre super, wenn ihr mir da Impulse geben könntet. Ich habe online dazu leider nicht so viel dazu gefunden.


Danke schon mal!
Zuletzt geändert von kosa am So Okt 27, 2019 8:42 pm, insgesamt 1-mal geändert.

Benutzeravatar
EDi
Beiträge: 1062
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Mergng von Datensätzen über Teilnehmer ID

Beitrag von EDi »

HAGW17 hat offensichtlich nicht mehr an der zweiten Messung teilgenommen.
R matched nun SAGW17 von t1 mit SAGW17 (t2). Das ist korrekt und gewollt.
R matched aber auch HAGW17 von t1 mit SAGW17 von t2. Das ist nicht gewollt.
Sollte dann der Join nicht auch die Zeitvariable beinhalten, statt nur über die ID zu gehen?
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.

kosa
Beiträge: 16
Registriert: Mo Sep 02, 2019 6:47 pm

Re: Mergng von Datensätzen über Teilnehmer ID

Beitrag von kosa »

Danke für deine Antwort.

Du hast Recht, dass ich die Zeitvariable ebenfalls berücksichtigen könnte. Wie könnte ich das jedoch in den Befehl integrieren?

Kannst du mir da einen Hinweis geben?

kosa
Beiträge: 16
Registriert: Mo Sep 02, 2019 6:47 pm

Re: Mergng von Datensätzen über Teilnehmer ID

Beitrag von kosa »

Hallo alle,

ich habe mir jetzt mal ein nachvollziehbares Beispiel überlegt. In den folgenden Dataframes ist der Teilnehmercode (id), das Alter (age), das Geschlecht (gender, kodiert mit 1=männlich und 2=weiblich) und der Messzeitpunkt (time, kodiert mit 1(Messzeitpunkt 1) und 2(Messzeitpunkt 2)) festgehalten.

Code: Alles auswählen


library(fuzzyjoin)

abc<- data.frame(
  id = c("SABD15","HWKJ02","KLNM09","ZUIO08","SAJD15"),
  age = c(24,30,41,50,34),
  gender = c(1,2,1,1,2),
  time = c(1,1,1,1,1)
)

def<- data.frame(
  id = c("SABD15","HWKJ02","KLNM90","ZUIO08","FGZT04"),
  age = c(24,30,41,50,34),
  gender = c(1,2,1,1,2),
  time = c(2,2,2,2,2)
)

Mit diesen Befehlen erhalte ich folgende dataframes:

> abc
id age gender time
1 SABD15 24 1 1
2 HWKJ02 30 2 1
3 KLNM09 41 1 1
4 ZUIO08 50 1 1
5 SAJD15 34 2 1

> def
id age gender time
1 SABD15 24 1 2
2 HWKJ02 30 2 2
3 KLNM90 41 1 2
4 ZUIO08 50 1 2
5 FGZT04 34 2 2

Ich würde diese Tabellen nun gern über die id fuzzy matchen und über z.B. age exakt Matchen wollen. Denn man kann vermuten, dass es bei der id zu Schreibfehlern kommen kann wie am Bsp. KLNM09 (aus abc) und KLNM90 aus (def) sehen kann. age und gender stimmen überein, aber die id stimmt um einer Ziffer nicht überein.

Wenn ich nur über die id matche, dann passiert folgendes:

Code: Alles auswählen


abcdef<-stringdist_inner_join(abc, def, 
                           by = c("id", "id"),max_dist=1)

> abcdef
id.x age.x gender.x time.x id.y age.y gender.y time.y
1 SABD15 24 1 1 SABD15 24 1 2
2 HWKJ02 30 2 1 HWKJ02 30 2 2
3 KLNM09 41 1 1 KLNM90 41 1 2
4 ZUIO08 50 1 1 ZUIO08 50 1 2
5 SAJD15 34 2 1 SABD15 24 1 2

KLNM09 und KLMN90 wurden gematched. Das ist gewollt. Aber dadurch, dass ich durch das Distanzmaß 1 eine unterschiedliche Ziffer im Matchvorgang über die id zulasse, konnte SABD15 (aus def) zweimal zu ids (aus abc) zugewiesen werden. Einmal zu SABD15 und einmal zu SAJD15. Wenn man sich das Alter und das Geschlecht anschaut, sieht man jedoch, dass letztere Match nicht berechtigt ist, da das age und gender nicht übereinstimmen und es sich daher nicht um dieselbe Person handelt.

Wie könnte ich in meine obige Funktion nun noch einfügen, dass zum Beispiel, das Alter und/oder das Geschlecht ebenfalls exakt übereinstimmen müssen? Kann mir da jemand helfen?

Danke!

Und entschuldigt, dass die Tabellen so verzogen sind. ich wusste nicht, wie man sich diese im Antwortfenster richtig anzeigen lassen kann.

Antworten