Wie kann ich merge mehrere dataframes mit den gleichen Spaltennamen?
, Was ich haben:
Ich habe ein "master" dataframe, der die folgenden Spalten:
userid, condition
Da gibt es vier experiment-Bedingungen, ich habe auch vier dataframes, die Antwort von Informationen, mit den folgenden Spalten:
userid, condition, answer1, answer2
Nun, ich würde gerne mitmachen diese, damit alle Kombinationen von Benutzer-IDs, die Bedingungen und Ihre Antworten zu diesen Bedingungen zusammengeführt werden. Jeder Zustand sollte nur die richtige Antwort in die entsprechende Spalte, pro Zeile.
Kurze, in sich geschlossenes Beispiel:
master = data.frame(userid=c("foo","foo","foo","foo","bar","bar","bar","bar"), condition=c("A","B","C","D","A","B","C","D"))
cond_a = data.frame(userid=c("foo","bar"), condition="A", answer1=c("1","1"), answer2=c("2","2"))
cond_b = data.frame(userid=c("foo","bar"), condition="B", answer1=c("3","3"), answer2=c("4","4"))
cond_c = data.frame(userid=c("foo","bar"), condition="C", answer1=c("5","5"), answer2=c("6","6"))
cond_d = data.frame(userid=c("foo","bar"), condition="D", answer1=c("7","7"), answer2=c("8","8"))
Wie führe ich alle Bedingungen, die in den master, so dass die master-Tabelle sieht wie folgt aus?
userid condition answer1 answer2
1 bar A 1 2
2 bar B 3 4
3 bar C 5 6
4 bar D 7 8
5 foo A 1 2
6 foo B 3 4
7 foo C 5 6
8 foo D 7 8
Ich habe versucht, die folgenden:
temp = merge(master, cond_a, all.x=TRUE)
Gibt mir:
userid condition answer1 answer2
1 bar A 1 2
2 bar B <NA> <NA>
3 bar C <NA> <NA>
4 bar D <NA> <NA>
5 foo A 1 2
6 foo B <NA> <NA>
7 foo C <NA> <NA>
8 foo D <NA> <NA>
Aber sobald ich dies tun...
merge(temp, cond_b, all.x=TRUE)
Gibt es keine Werte für die Bedingung B
. Wie kommt das?
userid condition answer1 answer2
1 bar A 1 2
2 bar B <NA> <NA>
3 bar C <NA> <NA>
4 bar D <NA> <NA>
5 foo A 1 2
6 foo B <NA> <NA>
7 foo C <NA> <NA>
8 foo D <NA> <NA>
- Ich habe gerade bemerkt, dass ich tun konnte
merge(temp, cond_b, all=TRUE)
, aber das würde mir zusätzliche Zeilen mitNA
s in es. Nicht ideal. - Würde dies helfen?
temp <-rbind(cond_a,cond_b,cond_c,cond_d) temp[order(temp["userid"]),]
Oder gibt es etwas bestimmtes, wie eine Beziehung mit Inhalt im master? - Im einfachen Fall von diesem post, ja, in der Tat! Ich habe ein paar extra-Spalten in der master -, die ist, warum es nicht funktioniert in meinem konkreten dataset – aber ich habe nicht erwähnt, dass, so fühlen sich frei zu posten, dass als ein Beispiel, wie gut.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
Reduce()
undcomplete.cases()
wie folgt:Reduce()
könnte etwas daran gewöhnt. Definieren Sie die Funktion, und geben Sie dann einenlist
Objekte wiederholt anwenden der Funktion. Also, diese Aussage ist wie das tun:Oder etwas wie:
complete.cases()
erzeugt einen logischen Vektor, ob die angegebenen Spalten sind "abgeschlossen" ist oder nicht; dieser logische Vektor kann verwendet werden, um die Teilmenge von zusammengeführtendata.frame
.master
Daten-frame enthalten zusätzliche Spalten, die ich behalten wollte? Im Grunde, würde ich nur wollen, ordnen Sie die Antworten zu den einzigartigenuserid
undcondition
Paare.foo, A, 1, 2, other
, aber dannfoo, B, <NA>, <NA>, blah
, die entfernt werden würde in dercomplete.cases()
Schritt.rbind
alle Bedingungen, dataframes und erst dannmerge(master, all_conditions, all.x=TRUE)
dies scheint mir alles.Wie gesagt durch die OP, da keine explizite Beziehung mit den master-Daten-frame, eine option ist diese:
Vielleicht, wenn die Beziehung bekannt wurde, könnte es eine nicht-reduktionistische Lösung.
userid
undcondition
sind Faktoren, die in der experiment-Daten, während die Antwort erzielt werden einfache numerische Elemente, die gehören zu einem bestimmten Benutzer und Behandlung.Können Sie Ausdruck dieser Verknüpfung als
SQL
- Anweisung, und verwenden Sie dann diesqldf
Bibliothek, um es auszuführen.Sie erwähnt in einem Kommentar, dass die master-dataframe hat zusätzliche Spalten, die nicht in der cond dataframes. Sie sollten in der Lage sein, dies zu ändern SQL-Abfrage, um noch für diesen Fall.