2016-03-30 14 views
2

I 2-Datenrahmen mit passenden Spalten und einen gemeinsamen Faktor zusammenführen möchten, aber mit unterschiedlichen Werten in den Zeilen, wie folgt aus:Merging Reihen in R

x <- data.frame(x = c("Uno", "Due", "Tre", "Quattro", "Cinque"), y = c("A", "B", "C", "D", "E")) 
      x y 
    1  Uno A 
    2  Due B 
    3  Tre C 
    4 Quattro D 
    5 Cinque E 

y <- data.frame(x = c("Uno", "Tre", "Cinque"), y = c("F", "G", "H")) 
      x y 
    1  Uno F 
    2  Tre G 
    3 Cinque H 

und ich möchte bekommen:

 x y 
1  Uno A, F 
2  Due B 
3  Tre C, G 
4 Quattro D 
5 Cinque E, H 

Viele Beiträge lösen dies mit Aggregat und merge für Zahlen, und ich weiß nicht, was ich für Strings tun soll. Muss ich meine eigene Funktion mit Funktion (x, etc) machen?

+0

Ist das immer ein LEFT JOIN? Oder könnte es Werte geben, die im 'x' Datenrahmen nicht vorhanden sind? Sind diese Werte im realen Beispiel auch "Faktor" oder "Charakter" Klasse? –

+0

Hallo David, es ist nicht nur ein linker Join, X könnte Daten haben, die nicht in Y und umgekehrt vorhanden sind. Die Verbindungsspalte könnte ein Faktor sein, aber alle anderen Spalten sind Strings. – Matteo

Antwort

3

Wenn Ihre Werte in der y Spalte sind Zeichen eher Faktoren, könnte dies eine einfache Aufgabe data.table

x <- data.frame(x = c("Uno", "Due", "Tre", "Quattro", "Cinque"), 
       y = c("A", "B", "C", "D", "E"), 
       stringsAsFactors = FALSE) 
y <- data.frame(x = c("Uno", "Tre", "Cinque"), 
       y = c("F", "G", "H"), 
       stringsAsFactors = FALSE) 

(Beachten Sie die stringsAsFactors = FALSE)

Dann mit seinem (vorausgesetzt, Sie immer einem linken tun join)

library(data.table) 
setDT(x)[y, y := toString(c(y, i.y)), on = "x", by = .EACHI] 
x 
#   x y 
# 1:  Uno A, F 
# 2:  Due B 
# 3:  Tre C, G 
# 4: Quattro D 
# 5: Cinque E, H 

Dies ist im Grunde die Kombination y Spalten aus beiden Datensätzen auf t er fliegt (beim Beitritt auf die x Spalten) und aktualisiert y an Ort und Stelle (ohne einen neuen Datensatz zu erstellen).

+0

Was ist, wenn es nicht immer eine linke Verbindung ist? x könnte Einträge haben, die y nicht hat und umgekehrt. – Matteo

+0

Auch habe ich den Fehler gemacht, die Spalte wie die Dateien zu nennen, und ich bin nicht sicher, welche welche ist. – Matteo

1

Sie können dies leicht tun dplyr mit

x <- data.frame(x = c("Uno", "Due", "Tre", "Quattro", "Cinque"), y = c("A", "B", "C", "D", "E"), stringsAsFactors = F) 

y <- data.frame(x = c("Uno", "Tre", "Cinque"), y = c("F", "G", "H"), stringsAsFactors = F) 


jdf <- full_join(x,y,"x") 

transmute(jdf, x = x, y = ifelse(is.na(y.y),y.x,paste(y.x, y.y, sep=', '))) 

x y 
1  Uno A, F 
2  Due B 
3  Tre C, G 
4 Quattro D 
5 Cinque E, H 
+0

Ich glaube, Sie haben nicht alle verwendeten Pakete erwähnt. Fügen Sie wahrscheinlich auch das Ergebnis dieser Operation hinzu. –

+0

1) 'join_all' ist keine dplyr-Funktion. 2) die Ausgabe erstellt NA String-Kombinationen http://www.inside-r.org/packages/cran/plyr/docs/join_all –

+0

Danke für die Eingabe. Ich habe es in eine reine Antwort umgewandelt. Ich musste von @David Arenburg Modifikation ausleihen, um ZeichenfolgenASFactors zu verwenden. – JereB