조인으로 데이터프레임 연결하기

조인으로 데이터프레임 연결하기

데이터 분석이 하나의 데이터프레임만으로 끝나는 경우는 드물어요. 보통 여러 데이터프레임을 **조인(join)**해서 원하는 질문에 답해야 하죠. 이 페이지에서는 다른 데이터프레임에서 맞는 관측을 찾아 새 변수를 붙이는 변형 조인(mutating join)과, 맞는 관측이 있는지에 따라 행을 거르는 필터링 조인(filtering join)을 알아볼게요.

출처: R for Data Science(2e) — Joins

본문

키(key) 이해하기

조인을 하려면 먼저 두 테이블을 연결해 주는 키가 필요해요. 키에는 두 종류가 있어요.

**기본 키(primary key)**는 각 관측을 유일하게 식별하는 변수(또는 변수 집합)예요. 변수가 여러 개 필요하면 **복합 키(compound key)**라고 불러요. 예를 들어 airlines에서는 항공사 코드 carrier가, airports에서는 공항 코드 faa가 기본 키예요.

**외래 키(foreign key)**는 다른 테이블의 기본 키와 대응하는 변수예요. flights$carrierairlines$carrier와, flights$tailnumplanes$tailnum과 대응하죠.

기본 키 검증하기

기본 키가 정말로 각 관측을 유일하게 식별하는지 확인하는 게 좋아요. count()로 기본 키를 센 뒤 n > 1인 항목이 있는지 보면 돼요. 기본 키에 결측값이 있는지도 확인해야 해요. 값이 빠져 있으면 그 관측을 식별할 수 없으니까요.

planes |>
  count(tailnum) |>
  filter(n > 1)

ratio_j <- airports |>
  count(alt, lat) |>
  filter(n > 1)

airports 예처럼 고도와 위도 조합은 기본 키로 어울리지 않아요. 데이터만 보고 어떤 변수 조합이 좋은 기본 키인지 알기는 어렵고, 사실 기본 키가 없다면 행 번호를 이용한 **대리 키(surrogate key)**를 만들어 쓰는 게 좋을 때도 있어요.

flights2 <- flights |>
  mutate(id = row_number(), .before = 1)

대리 키는 사람끼리 소통할 때 특히 유용해요. "2013년 1월 3일 오전 9시에 출발한 UA430을 봐"라고 말하는 것보다 "2001번 항공편을 봐"라고 말하는 게 훨씬 편하니까요.

변형 조인(mutating joins)

변형 조인은 다른 데이터프레임에서 일치하는 관측을 찾아 새 변수를 첫 번째 데이터프레임에 붙여요. 주요 함수는 left_join(), inner_join(), full_join()이에요. 무엇보다 결과 데이터프레임이 몇 행이 될지 아는 게 중요해요.

  • inner_join(x, y): 두 테이블 모두에서 일치하는 행만 남겨요. 없는 행은 결과에서 빠져요.
  • left_join(x, y): x의 모든 행을 남기고, y에서 일치하는 값이 있으면 붙이고 없으면 NA로 채워요.

기본적으로 같은 이름의 변수를 키로 쓰는데, 이름이 다를 땐 join_by()로 지정할 수 있어요.

필터링 조인(filtering joins)

필터링 조인은 다른 테이블에서 일치하는 행이 있는지에 따라 관측을 걸러내요. semi_join(x, y)y와 일치하는 x의 행만 남기고, anti_join(x, y)는 일치하지 않는 행만 남겨요.

비동등 조인(non-equi joins)

조인은 기본적으로 키 간의 **같음(equality)**을 기준으로 하지만, join_by()를 쓰면 그보다 유연한 매칭이 가능해요. 예를 들어 between()으로 어떤 날짜가 다른 날짜 구간에 속하는지 매칭할 수 있어요. 범위가 겹치는지 확인하는 overlaps()도 자주 써요.

employees |>
  inner_join(parties, join_by(between(birthday, start, end)), unmatched = "error")

unmatched = "error"는 매칭되지 않는 행이 있으면 바로 알려주게 해서, 데이터 문제를 빨리 발견하고 싶을 때 좋아요.

더 알아보기

  • 조인의 자세한 동작 방식과 행·열 세부 규칙은 Joins 원문 페이지에서 더 다뤄요.
  • nycflights13 패키지의 다섯 데이터프레임 간 관계는 해당 패키지 문서에서 확인할 수 있어요.
  • tidyverse 내에서 키 이름이 거의 항상 같게 지어지는 관례 덕분에 조인이 쉬워져요.