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


89

我有两个要使用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语料库是识别性别的一种不好方法。我正在努力实现更好的实现,但是我想首先使这种工作生效。)


3
您目前
hadley 2014年

Answers:


148

dplyr v0.3中已添加此功能。现在,您可以将命名的字符向量传递给(和其他联接函数)中的by参数,left_join以指定要在每个数据帧中联接的列。对于原始问题中给出的示例,代码将为:

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

13
编辑该作品在一般情况下,以及: left_join(data_a, data_b, by = c("a.first" = "b.first", "a.second" = "b.second", "a.third" = "b.third"))
davidski '16

by =是可选的。您可以做left_join(test_data, kantrowitz, c("first_name" = "name"))
Pranay Aryal

11
函数的任何参数都是如此。但是我通常会发现,使用命名参数而不是在这种情况下进行位置匹配来使其更明确。
林肯·马伦

5

这不是真正的解决方案,而是更多解决方法。您可以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>

我认为重命名会产生一个副本,这可能是dplyr避免它并让您执行它的一种方式。
joran 2014年

2
在0.1.2中,您至少可以做到select(test_data, first_name = name),而只能复制一个浅表。
hadley 2014年

1
使用data.table::setnames

2
解决方案select(test_data,first_name = name)自2014
失效
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.