在加入 dplyr 时如何为 x 和 y 指定列的名称?

我想使用 dplyr 连接两个数据框架,一个是包含名字的数据框架。

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中一样。

在基础 R 中,我会这样执行合并:

merge(test_data, kantrowitz, by.x = "first_names", by.y = "name", all.x = TRUE)

That returns the correct output:

  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 语料库不是一个识别性别的好方法。我正在开发一个更好的实现,但是我想先让它工作起来。)

179406 次浏览

This is more a workaround than a real solution. You can create a new object test_data with another column name:

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>

这个特性是在 dplyr v0.3中添加的。现在可以将命名字符向量传递给 left_join中的 by参数(以及其他连接函数) ,以指定在每个数据帧中连接哪些列。根据原问题中给出的例子,代码如下:

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