การเชื่อมหลายตารางใน dplyr
เชี่ยวชาญ inner_join, left_join, right_join, full_join และ anti_join
การเชื่อมหลายตารางใน dplyr เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน 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 แถวใน x ที่ไม่มีรายการตรงกันใน y จะได้ค่า NA ในคอลัมน์ของ y ตารางฝั่งซ้ายเป็นตัวกำหนดผลลัพธ์
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 แถวใน y ที่ไม่มีรายการตรงกันใน x จะได้ค่า NA ในคอลัมน์ของ x ซึ่งเป็นการทำงานตรงข้ามกับ 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') ส่งคืนแถวใน x ที่ไม่มีรายการตรงกันใน y โดยจะไม่รวมคอลัมน์ใด ๆ จาก 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') ส่งคืนแถวใน x ที่มีรายการตรงกันใน y แต่จะไม่เพิ่มคอลัมน์ของ 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'))การเชื่อมการรวมตารางหลายครั้ง
คุณสามารถเชื่อมการรวมตารางหลายครั้งใน pipeline เดียวโดยใช้ตัวดำเนินการไปป์ ค่อย ๆ สร้างมุมมองข้อมูลแบบลดการทำให้เป็นบรรทัดฐาน ด้วยการเพิ่มข้อมูลจากตารางค้นหาหลายตารางทีละขั้น
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()— แถวใน x ที่ไม่มีรายการตรงกันใน y (เครื่องมือกรอง)semi_join()— แถวใน x ที่มีรายการตรงกันใน y (เครื่องมือกรอง)- ใช้
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)เรียนรู้ R ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 43
- บทเรียน
- 159
คำถามที่พบบ่อย
บทเรียน “การเชื่อมหลายตารางใน dplyr” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การเชื่อมหลายตารางใน dplyr” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การเชื่อมหลายตารางใน dplyr”
เชี่ยวชาญ inner_join, left_join, right_join, full_join และ anti_join คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การเชื่อมหลายตารางใน dplyr” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม
ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สรุปข้อมูลแบบจัดกลุ่มและ group_by()
- ฟังก์ชันหน้าต่าง: lag, lead, cumsum
- การเชื่อมหลายตารางใน dplyr
- การประเมินแบบเป็นระเบียบ: {{ }} และ .data