web-dev-qa-db-ja.com

dplyrに参加するときにxとyの列の名前を指定するにはどうすればよいですか?

Dplyrを使用して結合したい2つのデータフレームがあります。 1つは、名を含むデータフレームです。

test_data <- data.frame(first_name = c("john", "bill", "madison", "abby", "zzz"),
                        stringsAsFactors = FALSE)

もう1つのデータフレームには、性別を特定するカントロウィッツの名前コーパスのクリーンアップバージョンが含まれています。最小限の例を次に示します。

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

基本的に、kantrowitzテーブルを使用して、test_dataテーブルから名前の性別を検索します。これを関数encode_genderに抽象化するため、使用されるデータセットの列の名前がわからないため、nameになることを保証できません。 kantrowitz$nameのように。

ベースRでは、この方法でマージを実行します。

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でこれを行いたいと思います。さまざまな*_join関数のdplyr byオプションでは、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を使用してこの種の結合を実行する方法は何ですか?

(Kantrowitzコーパスが性別を特定するのに悪い方法であることを気にしないでください。私はより良い実装に取り​​組んでいますが、最初にこれを機能させたいです。)

71
Lincoln Mullen

この機能は、dplyr v0.3で追加されました。名前付き文字ベクトルをleft_join(およびその他の結合関数)のby引数に渡して、各データフレームで結合する列を指定できるようになりました。元の質問の例では、コードは次のようになります。

left_join(test_data, kantrowitz, by = c("first_name" = "name"))
114
Lincoln Mullen

これは、実際のソリューションよりも回避策です。別の列名で新しいオブジェクトtest_dataを作成できます。

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>
5
Sven Hohenstein