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.)