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()— 왼쪽의 모든 행 유지; 오른쪽에 일치 항목이 없으면 NAright_join()— 오른쪽의 모든 행 유지; 왼쪽에 일치 항목이 없으면 NAfull_join()— 양쪽의 모든 행 유지; 일치 항목이 없으면 NAanti_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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 그룹별 요약과 group_by()
- 윈도 함수: lag, lead, cumsum
- dplyr의 다중 테이블 조인
- 정돈된 평가: {{ }} 및 .data