如何在joindplyr时为x和y指定列的名称?

我有两个dataframe,我想要使用dplyrjoin。 一个是包含名字的数据框。

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

另一个数据框包含一个清理版本的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")) 

我基本上想使用kantrowitz表从test_data表中查找名字的性别。 因为我要把它抽象成一个函数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中这样做,因为我正在使用该包进行所有其他数据操作。 各种*_join函数的dplyr by选项只允许指定一个列名,但我需要指定两个。 我正在寻找这样的东西:

 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语料库是识别性别的一个坏方法,我正在更好的实现,但是我想首先得到这个结果。)

该function已添加到dplyr v0.3中。 您现在可以将一个已命名的字符向量传递给left_join (和其他连接函数)中的by参数,以指定在每个dataframe中join哪些列。 用原来的问题给出的例子,代码将是:

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

这是一个解决方法,而不是一个真正的解决scheme。 您可以使用另一个列名创build一个新的对象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>