0Pricing
R Academy · 강의

dplyr의 다중 테이블 조인

inner_join, left_join, right_join, full_join, anti_join을 익힙니다.

dplyr의 다중 테이블 조인은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

테이블을 조인하는 이유

실제 데이터가 하나의 테이블에만 저장되는 경우는 드뭅니다. 관계형 데이터베이스는 중복을 피하기 위해 정보를 여러 테이블로 나눕니다. 조인을 사용하면 공유 키를 기준으로 테이블을 결합할 수 있습니다. dplyr은 깔끔하고 읽기 쉬운 문법으로 SQL 스타일의 조인 함수를 제공합니다.

library(dplyr)

# Two related tables
orders <- data.frame(
  order_id = 1:4,
  customer_id = c(1, 2, 1, 3),
  amount = c(250, 180, 320, 90)
)

customers <- data.frame(
  customer_id = 1:3,
  name = c('Alice','Bob','Carol'),
  city = c('NYC','LA','Chicago')
)

print(orders)
print(customers)

inner_join() — 일치하는 행만

inner_join(x, y, by='key')는 키가 두 테이블에 모두 존재하는 행만 반환합니다. 다른 테이블에서 일치하는 행이 없는 행은 제거됩니다. 가장 일반적인 조인 유형입니다.

library(dplyr)

orders <- data.frame(
  order_id = 1:4,
  customer_id = c(1, 2, 1, 99),
  amount = c(250, 180, 320, 90)
)

customers <- data.frame(
  customer_id = c(1, 2, 3),
  name = c('Alice','Bob','Carol')
)

# customer_id = 99 in orders has no match => dropped
# customer_id = 3 in customers has no match => dropped
inner_join(orders, customers, by = 'customer_id')

left_join() — 왼쪽의 모든 행 유지

left_join(x, y, by='key')는 x의 모든 행을 유지하고 y에서 일치하는 데이터를 채워 넣습니다. y에서 일치하는 행이 없는 x의 행에는 y의 열에 NA가 들어갑니다. 왼쪽 테이블을 기준으로 결과가 결정됩니다.

library(dplyr)

orders <- data.frame(
  order_id = 1:4,
  customer_id = c(1, 2, 1, 99),
  amount = c(250, 180, 320, 90)
)

customers <- data.frame(
  customer_id = c(1, 2, 3),
  name = c('Alice','Bob','Carol')
)

# Order with customer_id=99 is kept, name = NA
left_join(orders, customers, by = 'customer_id')

right_join() — 오른쪽의 모든 행 유지

right_join(x, y, by='key')는 y의 모든 행을 유지합니다. x에서 일치하는 행이 없는 y의 행에는 x의 열에 NA가 들어갑니다. left_join()의 반대 개념이며, 테이블 순서를 바꿀 수 있으므로 덜 자주 사용됩니다.

library(dplyr)

orders <- data.frame(
  order_id = c(1, 2),
  customer_id = c(1, 2),
  amount = c(250, 180)
)

customers <- data.frame(
  customer_id = c(1, 2, 3),
  name = c('Alice','Bob','Carol')
)

# Carol (customer_id=3) has no orders => NA for order columns
right_join(orders, customers, by = 'customer_id')

full_join() — 모든 행 유지

full_join(x, y, by='key')는 두 테이블의 모든 행을 유지합니다. 어느 한쪽에만 존재하는 행에는 다른 테이블의 열에 NA가 들어갑니다. 데이터를 하나라도 잃어서는 안 될 때 사용합니다.

library(dplyr)

q1 <- data.frame(product = c('A','B','C'), q1_sales = c(100, 200, 150))
q2 <- data.frame(product = c('A','C','D'), q2_sales = c(120, 160, 90))

# D appears only in q2, B only in q1 => both kept
full_join(q1, q2, by = 'product')

anti_join() — 일치하지 않는 행 찾기

anti_join(x, y, by='key')는 y에서 일치하는 행이 없는 x의 행을 반환합니다. y의 열은 포함되지 않습니다. 고아 레코드, 일치하지 않는 주문 또는 참조 테이블에 누락된 항목을 찾는 데 매우 유용합니다.

library(dplyr)

all_employees <- data.frame(
  id = 1:5,
  name = c('Alice','Bob','Carol','Dave','Eve')
)

trained <- data.frame(id = c(1, 3, 5))

# Who has NOT completed training?
anti_join(all_employees, trained, by = 'id')

semi_join() — 일치 여부로 필터링

semi_join(x, y, by='key')는 y에 일치하는 행이 있는 x의 행을 반환하지만, y의 열은 추가하지 않습니다. inner_join()과 비슷하지만 x의 열만 반환하므로 필터 단계로 유용합니다.

library(dplyr)

products <- data.frame(
  id = 1:5,
  name = c('Widget','Gadget','Donut','Gizmo','Sprocket'),
  price = c(9.99, 24.99, 1.99, 14.99, 4.99)
)

ordered_products <- data.frame(id = c(1, 3, 5))

# Products that appear in at least one order
semi_join(products, ordered_products, by = 'id')

열 이름이 다른 테이블 조인

x와 y에서 키 열의 이름이 서로 다르면 by = c('x_col' = 'y_col') 문법을 사용합니다. 이 문법은 왼쪽 테이블의 열 이름을 오른쪽 테이블의 해당 열 이름에 연결합니다.

library(dplyr)

orders <- data.frame(
  order_id = 1:3,
  user_id = c(10, 20, 10),
  amount = c(100, 200, 150)
)

users <- data.frame(
  id = c(10, 20, 30),
  username = c('alice','bob','carol')
)

# orders.user_id matches users.id
left_join(orders, users, by = c('user_id' = 'id'))

여러 키로 조인하기

by에 벡터를 전달하면 여러 열을 기준으로 조인할 수 있습니다. 행이 조인되려면 지정한 모든 열이 일치해야 합니다. 하나의 열만으로는 고유하지 않은 복합 키를 처리할 때 사용합니다.

library(dplyr)

actual <- data.frame(
  year = c(2023, 2023, 2024, 2024),
  quarter = c('Q1','Q2','Q1','Q2'),
  sales = c(100, 120, 130, 150)
)

target <- data.frame(
  year = c(2023, 2023, 2024, 2024),
  quarter = c('Q1','Q2','Q1','Q2'),
  target = c(110, 115, 125, 145)
)

inner_join(actual, target, by = c('year', 'quarter'))

여러 조인 연결하기

파이프 연산자를 사용하면 하나의 파이프라인에서 여러 조인을 연결할 수 있습니다. 여러 조회 테이블의 정보를 한 단계씩 추가하여 비정규화된 뷰를 구성할 수 있습니다.

library(dplyr)

orders <- data.frame(order_id=1:3, cust_id=c(1,2,1), prod_id=c(10,10,20))
customers <- data.frame(cust_id=1:2, name=c('Alice','Bob'))
products <- data.frame(prod_id=c(10,20), product=c('Widget','Gadget'))

orders %>%
  left_join(customers, by = 'cust_id') %>%
  left_join(products, by = 'prod_id')

중복 열 처리하기

두 테이블에 조인 키 이외의 같은 이름을 가진 열이 있으면 dplyr은 .x 및 .y 접미사를 추가합니다. suffix 인수로 이 접미사를 사용자 지정한 다음 필요에 따라 선택하거나 이름을 바꿀 수 있습니다.

library(dplyr)

current <- data.frame(id=1:3, value=c(10,20,30), date=Sys.Date())
historic <- data.frame(id=1:3, value=c(8,22,28), date=Sys.Date()-365)

# Both have 'value' and 'date' columns
result <- inner_join(current, historic, by='id',
                     suffix=c('_current','_historic'))
print(names(result))

빠른 확인

오른쪽 테이블에 일치하는 행이 없는 왼쪽 테이블의 행만 반환하는 dplyr 조인은 무엇인가요?

복습: dplyr 조인

dplyr에서 여러 테이블을 조인할 때 기억할 핵심 내용:

  • inner_join() — 두 테이블에서 일치하는 행만 반환
  • left_join() — 왼쪽의 모든 행 유지; 오른쪽에 일치 항목이 없으면 NA
  • right_join() — 오른쪽의 모든 행 유지; 왼쪽에 일치 항목이 없으면 NA
  • full_join() — 양쪽의 모든 행 유지; 일치 항목이 없으면 NA
  • anti_join() — y에 일치 항목이 없는 x의 행(필터 도구)
  • semi_join() — y에 일치 항목이 있는 x의 행(필터 도구)
  • 열 이름이 다르면 by = c('x_col' = 'y_col') 사용
  • 복합 키에는 벡터 사용: by = c('year', 'quarter')
library(dplyr)

# Chain of joins: the typical real-world pattern
orders <- data.frame(oid=1:3, cid=c(1,2,1), pid=c(10,20,10))
customers <- data.frame(cid=1:2, name=c('Alice','Bob'))
products <- data.frame(pid=c(10,20), name=c('Widget','Gadget'), price=c(9.99,19.99))

orders %>%
  inner_join(customers, by='cid') %>%
  inner_join(products, by='pid', suffix=c('','_product')) %>%
  select(oid, name, name_product, price)

자주 묻는 질문

“dplyr의 다중 테이블 조인” 강의는 무료인가요?

네 — “dplyr의 다중 테이블 조인” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“dplyr의 다중 테이블 조인”에서 뭘 배우나요?

inner_join, left_join, right_join, full_join, anti_join을 익힙니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“dplyr의 다중 테이블 조인” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 그룹별 요약과 group_by()
  2. 윈도 함수: lag, lead, cumsum
  3. dplyr의 다중 테이블 조인
  4. 정돈된 평가: {{ }} 및 .data
← R Academy(으)로 돌아가기