102

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

test_data私は基本的に、テーブルを使用してテーブルから名前の性別を調べたいと思っていkantrowitzます。これを関数 に抽象化するencode_genderので、使用されるデータセット内の列の名前がわからないため、 のように になることを保証できませnamekantrowitz$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 でこれを実行したいと考えています。さまざまな関数の dplyrbyオプションでは、*_join1 つの列名しか指定できませんが、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コーパスが性別を識別するのに悪い方法であることは気にしないでください。私はより良い実装に取り​​組んでいますが、最初にこれを機能させたいと思っています。)

4

2 に答える 2

176

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

left_join(test_data, kantrowitz, by = c("first_name" = "name"))
于 2014-10-17T19:44:37.507 に答える