Ich habe zwei Datenrahmen, denen ich mit dplyr beitreten möchte. Einer ist ein Datenrahmen, der Vornamen enthält.
test_data <- data.frame(first_name = c("john", "bill", "madison", "abby", "zzz"),
stringsAsFactors = FALSE)
Der andere Datenrahmen enthält eine bereinigte Version des Kantrowitz-Namenskorpus, die das Geschlecht identifiziert. Hier ist ein minimales Beispiel:
kantrowitz <- structure(list(name = c("john", "bill", "madison", "abby", "thomas"), gender = c("M", "either", "M", "either", "M")), .Names = c("name", "gender"), row.names = c(NA, 5L), class = c("tbl_df", "tbl", "data.frame"))
Ich möchte im Wesentlichen das Geschlecht des Namens test_data
anhand der kantrowitz
Tabelle aus der Tabelle nachschlagen . Da ich dies in eine Funktion abstrahieren encode_gender
werde, kenne ich den Namen der Spalte in dem Datensatz, der verwendet werden soll, nicht und kann daher nicht garantieren, dass dies der Fall ist name
, wie in kantrowitz$name
.
In der Basis würde RI die Zusammenführung folgendermaßen durchführen:
merge(test_data, kantrowitz, by.x = "first_names", by.y = "name", all.x = TRUE)
Das gibt die richtige Ausgabe zurück:
first_name gender
1 abby either
2 bill either
3 john M
4 madison M
5 zzz <NA>
Aber ich möchte dies in dplyr tun, weil ich dieses Paket für alle meine anderen Datenmanipulationen verwende. Mit der by
Option dplyr für die verschiedenen *_join
Funktionen kann ich nur einen Spaltennamen angeben, aber ich muss zwei angeben. Ich suche so etwas:
library(dplyr)
# either
left_join(test_data, kantrowitz, by.x = "first_name", by.y = "name")
# or
left_join(test_data, kantrowitz, by = c("first_name", "name"))
Wie kann diese Art von Join mit dplyr ausgeführt werden?
(Egal, dass der Kantrowitz-Korpus ein schlechter Weg ist, um das Geschlecht zu identifizieren. Ich arbeite an einer besseren Implementierung, aber ich möchte, dass dies zuerst funktioniert.)
Antworten:
Diese Funktion wurde in dplyr v0.3 hinzugefügt. Sie können jetzt einen benannten Zeichenvektor an das
by
Argument inleft_join
(und andere Verknüpfungsfunktionen) übergeben, um anzugeben, welche Spalten in jedem Datenrahmen verknüpft werden sollen. Mit dem Beispiel in der ursprünglichen Frage wäre der Code:left_join(test_data, kantrowitz, by = c("first_name" = "name"))
quelle
left_join(data_a, data_b, by = c("a.first" = "b.first", "a.second" = "b.second", "a.third" = "b.third"))
?by =
ist optional. Sie können tunleft_join(test_data, kantrowitz, c("first_name" = "name"))
Dies ist eher eine Problemumgehung als eine echte Lösung. Sie können ein neues Objekt
test_data
mit einem anderen Spaltennamen erstellen :left_join("names<-"(test_data, "name"), kantrowitz, by = "name") name gender 1 john M 2 bill either 3 madison M 4 abby either 5 zzz <NA>
quelle
select(test_data, first_name = name)
und das wird nur eine flache Kopie machen.data.table::setnames
?