merge-Funktion: einzelne Fälle verdoppelt

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

Moderatoren: EDi, jogo

Antworten
Michelle_Magnum
Beiträge: 8
Registriert: Mi Mai 22, 2019 11:54 am

merge-Funktion: einzelne Fälle verdoppelt

Beitrag von Michelle_Magnum »

Hallo zusammen,

ich versuche gerade, zwei dataframes über die merge-Funktion miteinander zu verbinden.
Dazu verwende ich den left-join (all.x=T); die ID-Variable hat zwar verschiedene Namen in den beiden Datensätzen, enthält jedoch die gleichen Informationen (abgesehen davon, dass in der ID-Variable im zweiten Datensatz mehr Fälle als im 1. drin sind, die ich nicht alle brauche).

Das Problem dabei besteht darin, dass nach dem mergen drei Fälle mehr auf der "linken" ID sind, als es eigentlich sein sollten. Drei Fälle werden verdoppelt und ich weiß nicht, warum.

Hat jemand eine Idee, woran das liegen könnte?

Vielen Dank schonmal
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: merge-Funktion: einzelne Fälle verdoppelt

Beitrag von jogo »

Hallo Michelle,

willkommen im Forum!
Michelle_Magnum hat geschrieben: Mi Mai 22, 2019 3:47 pm ich versuche gerade, zwei dataframes über die merge-Funktion miteinander zu verbinden.
Dazu verwende ich den left-join (all.x=T); die ID-Variable hat zwar verschiedene Namen in den beiden Datensätzen, enthält jedoch die gleichen Informationen (abgesehen davon, dass in der ID-Variable im zweiten Datensatz mehr Fälle als im 1. drin sind, die ich nicht alle brauche).
Und welcher von diesen mehreren Fälle der gleichen ID im zweiten Datensatz wird gebraucht?
Das Problem dabei besteht darin, dass nach dem mergen drei Fälle mehr auf der "linken" ID sind, als es eigentlich sein sollten. Drei Fälle werden verdoppelt und ich weiß nicht, warum.

Hat jemand eine Idee, woran das liegen könnte?
Wenn ich Dich richtig verstehe ist die ID im ersten Datensatz eindeutig vergeben (es gibt nur eine Zeile mit dieser ID) und im zweiten Datensatz trifft das nicht zu (es gibt eine ID, die in mehreren Zeilen auftaucht).
Genau dies ist die Ursache.

Code: Alles auswählen

D1 <- data.frame(x=c("a", "b", "c"), y=11:13)
D2 <- data.frame(x=c("a", "a", "c", "c", "c"), z=101:105)
merge(D1, D2, all.x=TRUE)
Gruß, Jörg
Michelle_Magnum
Beiträge: 8
Registriert: Mi Mai 22, 2019 11:54 am

Re: merge-Funktion: einzelne Fälle verdoppelt

Beitrag von Michelle_Magnum »

Hallo Jörg,

danke :)

das habe ich wohl nicht ganz präzise formuliert. Die ID ist nicht im ersten Datensatz eindeutig vergeben, sondern im zweiten. Im ersten weisen einige Fälle die gleiche ID auf. Allerdings führt das nur bei den drei oben genannten Fällen zu Problemen. Andere Fälle haben zwar auch die gleiche ID, können aber problemlos zugeordnet werden ohne Verdopplung.

Ich überlege gerade, ob dann doch ein right join besser wäre, aber ich will ja nur alle Fälle behalten, die im 1. ("linken") Datensatz sind...
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: merge-Funktion: einzelne Fälle verdoppelt

Beitrag von jogo »

Hallo Michelle,

Du wirst wohl nicht um ein kleines reproduzierbares Beispiel drumrumkommen, siehe
viewtopic.php?f=20&t=11 oder
https://stackoverflow.com/questions/596 ... le-example

Gruß, Jörg
Michelle_Magnum
Beiträge: 8
Registriert: Mi Mai 22, 2019 11:54 am

Re: merge-Funktion: einzelne Fälle verdoppelt

Beitrag von Michelle_Magnum »

Hallo Jörg,

die Daten kann ich nicht veröffentlichen, daher habe ich einen kleinen beispielhaften Datensatz selbst erstellt. Den Fehler kann ich leider nicht reproduzieren, sonst wüsste ich wohl auch, wo das Problem liegt...
Aber vielleicht hilft der Beispieldatensatz zum Verständnis.

Hier der Code für den Datensatz:

Code: Alles auswählen

### reproduzierbares Beispiel ###

rm(list = ls())

# dataframe1
ID_1 <- c("A1", "A2", "A2", "A2", "A4", "A7", "A7", "A8", "A9", "A9")
Backsorte <- c("Weißbrot", "Obstkuchen", "Muffin", "Schwarzbrot", "Sahnetorte", "Vollkornbrot", "Brötchen", "Käsekuchen", "Donut", "Gugelhupf")
Ofenzeit <- c(20, 20, 30, 60, 40, 50, 20, 30, 40, 40)

df1 <- data.frame(ID_1, Backsorte, Ofenzeit)

# dataframe2
ID_2 <- c("A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10", "A11", "A12", "A13")
Backsorte2 <- c("Weißbrot", "Obstkuchen, Muffin, Schwarzbrot", "Rosinenschnecke", "Sahnetorte", "Graubrot", "Hörnchen", "Vollkornbrot, Brötchen", "Käsekuchen", "Donut, Gugelhupf", "Brezel", "Laugenstange", "Croissant", "Erdbeerboden")
Rezept_vorhanden <- c(1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0)

df2 <- data.frame(ID_2, Backsorte2, Rezept_vorhanden)

# merge dataframes
neuerdf <- merge(df1, df2, by.x = "ID_1", by.y = "ID_2", all.x = TRUE)
Hier funktioniert das mergen. Wenn man das Problem, welches ich im originalen Datensatz habe, auf den Beispieldatensatz übertragen würde, würde z.B. die A7 im neuen, gemergten Beispieldatensatz nicht nur zwei Mal, sondern doppelt so häufig auftauchen, obwohl die gleichen Informationen vorhanden sind auf sämtlichen Variablen. Und dafür habe ich noch keine Erklärung gefunden.
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: merge-Funktion: einzelne Fälle verdoppelt

Beitrag von Athomas »

Wenn Du die Daten nicht veröffentlich darfst, ist es mit ein wenig Aufwand (von Deiner Seite!) leicht möglich, die wesentlichen Teile so zu maskieren, dass niemand etwas damit anfangen kann, etwa:

Code: Alles auswählen

# dataframe1
ID_1 <- c("A1", "A2", "A2", "A2", "A4", "A7", "A7", "A8", "A9", "A9")
Backsorte <- c("Weißbrot", "Obstkuchen", "Muffin", "Schwarzbrot", "Sahnetorte", "Vollkornbrot", "Brötchen", "Käsekuchen", "Donut", "Gugelhupf")
Ofenzeit <- c(20, 20, 30, 60, 40, 50, 20, 30, 40, 40)

df1 <- data.frame(ID_1, Backsorte, Ofenzeit, stringsAsFactors = FALSE)

Übersetzer.Backsorte <- c("kx","vy","Dackel","Tasse","Gabel","brr","links","Rendsburg","Ethik","Paternoster")
names(Übersetzer.Backsorte) <- c("Weißbrot", "Obstkuchen", "Muffin", "Schwarzbrot", "Sahnetorte", "Vollkornbrot", "Brötchen", "Käsekuchen", "Donut", "Gugelhupf")

Entgeheimisiert <- df1
Entgeheimisiert$Gurrpf <- Übersetzer.Backsorte[df1$Backsorte]
Entgeheimisiert$Backsorte <- NULL
Es gibt noch viele, viele alternative Methoden, die Maskierung durchzuführen...
Hauptsache, der Fehler bleibt 1:1 bestehen!
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: merge-Funktion: einzelne Fälle verdoppelt

Beitrag von jogo »

Hallo Michelle,

unter einem reproduzierbaren Beispiel verstehe ich eines,
das auch Dein Problem reproduziert.
Michelle_Magnum hat geschrieben: Do Mai 23, 2019 9:55 am

Code: Alles auswählen

### reproduzierbares Beispiel ###
...
Hier funktioniert das mergen. Wenn man das Problem, welches ich im originalen Datensatz habe, auf den Beispieldatensatz übertragen würde, würde z.B. die A7 im neuen, gemergten Beispieldatensatz nicht nur zwei Mal, sondern doppelt so häufig auftauchen, obwohl die gleichen Informationen vorhanden sind auf sämtlichen Variablen. Und dafür habe ich noch keine Erklärung gefunden.
Tut mir leid, ich verstehe immer noch nicht, wie das Problem bei Dir aussieht.

Gruß, Jörg
Antworten