如何在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>