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
현재는 할 수 없지만 할 일 목록에 있습니다. github.com/hadley/dplyr/issues/177
hadley

답변:


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

by =선택 사항입니다. 당신은 할 수 있습니다left_join(test_data, kantrowitz, c("first_name" = "name"))
Pranay Aryal

11
그것은 함수에 대한 모든 인수에 해당됩니다. 그러나 일반적으로이 경우 위치 일치보다 명명 된 인수를 사용하여 명시하는 것이 더 좋습니다.
Lincoln Mullen 2017

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

2
0.1.2에서는 적어도 할 수있을 select(test_data, first_name = name)것이고 그것은 얕은 복사본 만 만들 것입니다.
hadley

1
사용 data.table::setnames?
Hugh

2
솔루션 select (test_data, first_name = name)는 2014 년 6 월 현재 작동하지 않습니다
userJT
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.