2017-01-16 4 views
0

Ich versuche Datenrahmen bar-foo basierend auf einer gemeinsamen Spalte zu verbinden und halten dann die ursprüngliche Reihenfolge der Spalten in foo:Spalte Störung in merge()

> head(foo) 
      city course1 
1   Aalborg JEMES 
2   Aarhus EM-SANF 
3 Aix-en-Provence  EMLE 
4   Almaty IMRCEES 
5   Alnarp SUFONAMA 
6  Amsterdam ATOSIM 

> colnames(foo) 
[1] "city" "course1" 


> head(bar) 
     code          website 
1 4CITIES      http://www.4cities.eu/ 
2  ACES   http://www.sams.ac.uk/aces-erasmus 
3 ADVANCES   http://www.socialworkadvances.org/ 
4 AMASE    http://www.amase-master.net/ 
5 ARCHMAT http://www.erasmusmundus-archmat.uevora.pt/ 
6  ASC  

      http://www.master-asc.org/ 
> colnames(bar) 
[1] "code" "website" 

Die Joinspalte ist course in foo und code in bar.

test <- merge(x = foo, y = bar, by.x = "course1", by.y = "code", all.x=TRUE)[, union(names(foo), names(bar))] 

Dies schlägt fehl und erzeugt die folgende Fehlermeldung: Ich habe die folgende Formel verwendet

Error in `[.data.frame`(merge(x = foo, y = bar, by.x = "course1", by.y = "code", : 
    undefined columns selected 

ich diese Lösung here gefunden haben, aber es funktioniert nicht, obwohl keines der Spaltennamen sind dupliziert. Was könnte das Problem sein?

Ein einfacher verbinden Werke (ohne Nachbestellung), aber die Säule nach vorne kommen bringt:

> head(test) 
    course1  city     website 
1 JEMES Aalborg http://www.jemes-cisu.eu/ 
2 JEMES  Aveiro http://www.jemes-cisu.eu/ 
3 JEMES Hamburg http://www.jemes-cisu.eu/ 
4 EM-SANF  Aarhus http://www.emsanf.eu/UK/ 
5 EM-SANF Wageningen http://www.emsanf.eu/UK/ 
6 EM-SANF Debrecen http://www.emsanf.eu/UK/ 

Ich habe versucht, das Hinzufügen sort = F und all.x = TRUE zu entfernen, aber das funktioniert nicht. Das Problem ist, dass meine tatsächlichen Datenfelder viel mehr Spalten haben und mehrere Joins durchlaufen werden, so dass ich die Reihenfolge der Spalten in einer einzigen Funktion beibehalten möchte. Gibt es eine bekannte effektive Problemumgehung oder ein Paket, das die Spaltenreihenfolge in Joins beibehält?

> names(test) 
[1] "course1" "city" "website" 
> names(foo) 
[1] "city" "course1" 
> names(bar) 
[1] "code" "website" 
+0

Was zeigt 'names (test)'? Was zeigt dir "union (Namen (foo), Namen (bar))"? –

+0

hinzugefügt, dass am Ende der Post. Ich möchte einfach vermeiden, 'test <- x [c (2, 1, 3)]' jedes Mal neu zu sortieren, denn wenn ich Spalten hinzufüge, wird die Neuordnung immer mühsamer. –

+0

würde 'dplyr :: left_join (foo, bar, by = c ("course1" = "code")) 'arbeiten? – Nate

Antwort

1

Ihre Reindizierung ([,union(names(foo), names(bar))]) ist schuld: weil names(bar)"code" hat, die nicht vorhanden ist, erhalten Sie eine Indizierung Fehler. Hier ist der korrigierte Code:

allnames <- union(names(foo), recode(names(bar), code = "course1")) 
merge(foo, bar, by.x = "course1", by.y = "code", all.x = TRUE)[,allnames] 

Da Ihr Beispiel nicht reproduzierbar ist (die Zusammenführung hier ist leer, nichts gemein), ich werde mit einer modifizierten Struktur zeigen:

foo <- structure(list(city = c("Aalborg", "Aarhus", "Aix-en-Provence", 
    "Almaty", "Alnarp", "Amsterdam"), course1 = c("JEMES", "EM-SANF", 
    "EMLE", "IMRCEES", "SUFONAMA", "ATOSIM")), .Names = c("city", 
    "course1"), class = "data.frame", row.names = c(NA, -6L)) 
bar <- structure(list(code = c("4CITIES", "ACES", "ADVANCES", "AMASE", 
    "ARCHMAT", "ASC"), website = c("http://www.4cities.eu/", "http://www.sams.ac.uk/aces-erasmus", 
    "http://www.socialworkadvances.org/", "http://www.amase-master.net/", 
    "http://www.erasmusmundus-archmat.uevora.pt/", "http://www.master-asc.org/" 
    )), .Names = c("code", "website"), row.names = c(NA, 6L), class = "data.frame") 

und jetzt sicherzustellen, dass die Werte in bar$code vorhanden sind in foo$course:

set.seed(42) 
bar$code <- sample(foo$course1) 

Das Ergebnis:

allnames <- union(names(foo), recode(names(bar), code = "course1")) 
merge(foo, bar, by.x = "course1", by.y = "code", all.x = TRUE)[,allnames] 
#    city course1          website 
# 1  Amsterdam ATOSIM      http://www.4cities.eu/ 
# 2   Aarhus EM-SANF   http://www.socialworkadvances.org/ 
# 3 Aix-en-Provence  EMLE    http://www.amase-master.net/ 
# 4   Almaty IMRCEES http://www.erasmusmundus-archmat.uevora.pt/ 
# 5   Aalborg JEMES     http://www.master-asc.org/ 
# 6   Alnarp SUFONAMA   http://www.sams.ac.uk/aces-erasmus 
Verwandte Themen