merge-Funktion: einzelne Fälle verdoppelt
-
- Beiträge: 8
- Registriert: Mi Mai 22, 2019 11:54 am
merge-Funktion: einzelne Fälle verdoppelt
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
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
Re: merge-Funktion: einzelne Fälle verdoppelt
Hallo Michelle,
willkommen im Forum!
Genau dies ist die Ursache.
Gruß, Jörg
willkommen im Forum!
Und welcher von diesen mehreren Fälle der gleichen ID im zweiten Datensatz wird gebraucht?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).
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).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?
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)
-
- Beiträge: 8
- Registriert: Mi Mai 22, 2019 11:54 am
Re: merge-Funktion: einzelne Fälle verdoppelt
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...
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...
Re: merge-Funktion: einzelne Fälle verdoppelt
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
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
-
- Beiträge: 8
- Registriert: Mi Mai 22, 2019 11:54 am
Re: merge-Funktion: einzelne Fälle verdoppelt
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:
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.
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)
Re: merge-Funktion: einzelne Fälle verdoppelt
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:
Es gibt noch viele, viele alternative Methoden, die Maskierung durchzuführen...
Hauptsache, der Fehler bleibt 1:1 bestehen!
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
Hauptsache, der Fehler bleibt 1:1 bestehen!
Re: merge-Funktion: einzelne Fälle verdoppelt
Hallo Michelle,
unter einem reproduzierbaren Beispiel verstehe ich eines,
das auch Dein Problem reproduziert.
Gruß, Jörg
unter einem reproduzierbaren Beispiel verstehe ich eines,
das auch Dein Problem reproduziert.
Tut mir leid, ich verstehe immer noch nicht, wie das Problem bei Dir aussieht.Michelle_Magnum hat geschrieben: ↑Do Mai 23, 2019 9:55 amHier 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.Code: Alles auswählen
### reproduzierbares Beispiel ### ...
Gruß, Jörg