2016-06-22 13 views
1

Ich habe eine Basis df mit dem Titel help.a und ich versuche, help.b beitreten, aber wenn ich in help.b lesen die ID-Variable ist numerisch und nicht die gleiche Länge/Format wie die ID-Variable in help.a. Ich versuche, mit Charaktervariablen zu bleiben, weil left_join sie in Zeichen ändert, wenn die Ebenen des Faktors unterschiedlich sind.Wie können Zeichen zu Strings unterschiedlicher Größe hinzugefügt werden, um Datenrahmen über left_join zusammenzufügen?

help.a <- data.frame(id = as.character(c("00005", "00010", "00010", "00010", "00025", "00025", "00324", "00324")), 
         var_a = c(NA, 2, 2, 2, NA, NA, NA, NA), 
         var_b = c(4, NA, NA, 4, 4, 4, NA, NA)) 

help.b <- data.frame(id = c(5, 10, 324), 
         var_c = c(2, 2, 2), 
         var_d = c(4, NA, 6)) 

Mein Ansatz ist bisher jedoch help.b, um ein Zeichen zu ändern, ist es aufgrund der ids beizutreten versagt nicht passend:

help.b$id <- as.character(help.b$id) 
left_join(help.a, help.b) 

    id var_a var_b var_c var_d 
1 00005 NA  4 NA NA 
2 00010  2 NA NA NA 
3 00010  2 NA NA NA 
4 00010  2  4 NA NA 
5 00025 NA  4 NA NA 
6 00025 NA  4 NA NA 
7 00324 NA NA NA NA 
8 00324 NA NA NA NA 

Das ist mein gewünschtes Endergebnis:

 id var_a var_b var_c var_d 
1 00005 NA  4  2  4 
2 00010  2 NA  2 NA 
3 00010  2 NA  2 NA 
4 00010  2  4  2 NA 
5 00025 NA  4 NA NA 
6 00025 NA  4 NA NA 
7 00324 NA NA  2  6 
8 00324 NA NA  2  6 

und was ich denke, ich tun muß, ist in help.b und ändern id, um ein Zeichen zu lesen und fügen Sie dann „0“ zu jeder ID, aber alle müssen in der Länge 5 Zeichen gleich ... zB Zeile 1 würde vier brauchen "0's" und Zeile 2 würden drei "0's" benötigen. Auf diese Weise bemerkt left_join übereinstimmende Zeichenfolgen und verbindet sich entsprechend.

Jede Hilfe wird sehr geschätzt.

Antwort

2

Es sieht aus wie Sie suchen sprintf:

help.b$id <- sprintf("%05d", help.b$id) 

Mit dem d Sie zeigen, dass Sie ganze Zahlen formatiert werden soll, mit dem 05, dass Sie die resultierende Zahl wollen 5 Zeichen breit sein mit Nullen aufgefüllt .

Aus den Kommentaren erscheint, dass help.b$id eine Zeichenspalte ist. In diesem Fall auf der Plattform abhängig (auf Linux dies nicht funktioniert, die Hilfe filt von sprintf nicht, auf dem nicht sagen Plattformen dies funktioniert), Sie

help.b$id <- sprintf("%05s", help.b$id) 

Oder verwenden können,

# When help.b$id is a character use 
id <- as.numeric(help.b$id) 
# When help.b$id is a factor use 
id <- as.numeric(as.character(help.b$id)) 

# Just to make sure check the conversion went ok; should return empty vector and 
# if not the values for which the conversion went wrong. 
help.b$id[as.character(id) != help.b$id] 

help.b$id <- sprintf("%05d", id) 
+0

Ich möchte die 0's zu dem 'help.b' df though hinzufügen ... und wenn ich diesen Befehl verwende, erhalte ich eine Fehlermeldung mit dem Hinweis 'Fehler in sprintf ("% 05d ", help.b $ id): ungültiges Format '% 05d'; Verwenden Sie das Format% s für Zeichenobjekte ' – bpace

+0

Und wenn ich das über Befehl ausführen ... Es ändert die IDs auf sequentielle 00001, 00002, 00002, 00002, 00003, usw. – bpace

+1

Ok, die help.a $ ID ist ein Faktor. Und das bedeutet wahrscheinlich auch, dass Werte enthalten sind, die keine Zahlen sind. Versuchen Sie, '% 05d' in'% 05s' zu ändern. –

2

Eine Möglichkeit ist hier einfach die help.a$id Spalte in numerische konvertieren und dann die baseR verwenden merge() Funktion in LEFT JOIN Modus (all.x=TRUE):

> help.a$id <- as.numeric(as.character(help.a$id)) 

> merge(help.a, help.b, by="id", all.x=TRUE) 
    id var_a var_b var_c var_d 
1 5 NA  4  2  4 
2 10  2 NA  2 NA 
3 10  2 NA  2 NA 
4 10  2  4  2 NA 
5 25 NA  4 NA NA 
6 25 NA  4 NA NA 
7 324 NA NA  2  6 
8 324 NA NA  2  6 

Update:

Wenn für einige Aus diesem Grund möchten Sie die ursprüngliche Spalte beibehalten und dann eine Kopie davon im Datenrahmen help.a erstellen, z

help.a$id_orig <- help.a$id 

Tun Sie dies vor der Konvertierung help.a$id in numerisch.

+0

Der Datensatz, mit dem ich arbeite, hat mehr als 100.000 Zeilen, und wenn ich zu einem numerischen Wert übergehe, passiert etwas. Getrennt davon hoffe ich, die Variable im Faktor-/Zeichenformat für zukünftige Operationen im Skript zu behalten. – bpace

+0

Dann erstellen Sie eine Sicherung der Spalte und nennen sie 'help.a $ orig_id'. Was bedeutet "etwas verschraubt"? Ich sehe kein Problem mit der Umwandlung einer einzelnen Spalte in numerische (durch Zeichen). –

+0

Gute Frage :) Ich habe zusätzliche dfs in die Haupt-df zu verschmelzen und es scheint ein paar tausend Beobachtungen, die doppelt sind. Ich kann versuchen, dieses Problem zu diagnostizieren und die numerische Route zu verwenden. – bpace