我有两个要使用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"))
我本质上是想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选项仅允许我指定一个列名,但是我需要指定两个。我正在寻找这样的东西:
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语料库是识别性别的一种不好方法。我正在努力实现更好的实现,但是我想首先使这种工作生效。)