dplyrを使用して結合したい2つのデータフレームがあります。1つは、名を含むデータフレームです。
test_data <- data.frame(first_name = c("john", "bill", "madison", "abby", "zzz"),
stringsAsFactors = FALSE)
もう1つのデータフレームには、性別を識別するKantrowitz名コーパスのクリーンアップバージョンが含まれています。最小限の例を次に示します。
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"))
基本的に、test_data
テーブルを使用してkantrowitz
テーブルから名前の性別を調べたいと思います。私は関数にこの抽象化するつもりですのでencode_gender
、私が使用することになるだろう、データセット内の列の名前を知らないだろう、と私はそれがであることを保証することはできませんので、name
のように、kantrowitz$name
。
ベースRIでは、次のようにマージを実行します。
merge(test_data, kantrowitz, by.x = "first_names", by.y = "name", all.x = TRUE)
これにより、正しい出力が返されます。
first_name gender
1 abby either
2 bill either
3 john M
4 madison M
5 zzz <NA>
しかし、他のすべてのデータ操作にそのパッケージを使用しているので、dplyrでこれを実行したいと思います。by
さまざまな*_join
関数のdplyrオプションでは、1つの列名しか指定できませんが、2つ指定する必要があります。私はこのようなものを探しています:
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"))
dplyrを使用してこの種の結合を実行する方法は何ですか?
(カントロウィッツコーパスは性別を特定するための悪い方法であることを気にしないでください。私はより良い実装に取り組んでいますが、これを最初に機能させたいと思っています。)