จากแบบยาวเป็นแบบกว้างด้วย pivot_wider()
กระจายคู่คีย์-ค่ากลับเป็นตารางรูปแบบกว้าง
จากแบบยาวเป็นแบบกว้างด้วย pivot_wider() เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
เมื่อใดควรใช้รูปแบบกว้าง
แม้รูปแบบยาวจะเหมาะกับการวิเคราะห์ แต่รูปแบบกว้างมักจำเป็นสำหรับรายงาน สเปรดชีต และอัลกอริทึมบางประเภท (เช่น เมทริกซ์สหสัมพันธ์) pivot_wider() เป็นการทำงานย้อนกลับของ pivot_longer() โดยกระจายค่าจากคอลัมน์หนึ่งไปเป็นหลายคอลัมน์ใหม่
library(tidyr)
# Long format: one row per student-quarter combination
long_df <- data.frame(
student = c('Alice','Alice','Alice','Bob','Bob','Bob'),
quarter = c('Q1','Q2','Q3','Q1','Q2','Q3'),
score = c(85, 88, 92, 90, 85, 88)
)
print(long_df)
cat('\n', nrow(long_df), 'rows x', ncol(long_df), 'cols')พื้นฐานของ pivot_wider()
pivot_wider(df, names_from, values_from) แปลงข้อมูลจากรูปแบบยาวเป็นรูปแบบกว้าง names_from ระบุคอลัมน์ที่ค่าจะกลายเป็นชื่อคอลัมน์ใหม่ ส่วน values_from ระบุคอลัมน์ที่ค่าจะถูกนำไปเติมในคอลัมน์ใหม่เหล่านั้น
library(tidyr)
long_df <- data.frame(
student = c('Alice','Alice','Alice','Bob','Bob','Bob'),
quarter = c('Q1','Q2','Q3','Q1','Q2','Q3'),
score = c(85, 88, 92, 90, 85, 88)
)
wide_df <- pivot_wider(
long_df,
names_from = quarter,
values_from = score
)
print(wide_df)id_cols — การระบุคีย์ของแถว
id_cols ระบุคอลัมน์ที่ใช้ระบุแต่ละแถวในผลลัพธ์รูปแบบกว้างอย่างไม่ซ้ำกัน โดยค่าเริ่มต้น dplyr จะใช้คอลัมน์ทั้งหมดที่ไม่ได้ระบุไว้ใน names_from หรือ values_from การกำหนดค่าอย่างชัดเจนช่วยป้องกันการจัดกลุ่มที่ไม่คาดคิด
library(tidyr)
df <- data.frame(
year = c(2023,2023,2024,2024),
region = c('East','West','East','West'),
quarter = c('Q1','Q1','Q1','Q1'),
revenue = c(100, 200, 120, 220)
)
pivot_wider(
df,
id_cols = c(year, quarter),
names_from = region,
values_from = revenue
)values_fill — การจัดการชุดค่าผสมที่หายไป
เมื่อชุดค่าผสมบางชุดของ id_cols และ names_from ไม่มีอยู่ เซลล์ที่ได้จะเป็น NA ใช้ values_fill เพื่อแทนค่าที่หายไปเหล่านั้นด้วยค่าเริ่มต้น เช่น 0 สำหรับจำนวนหรือผลรวม
library(tidyr)
df <- data.frame(
product = c('A','A','B'),
channel = c('online','store','online'),
sales = c(100, 150, 200)
)
# 'B' has no 'store' data — fill with 0
pivot_wider(
df,
names_from = channel,
values_from = sales,
values_fill = 0
)names_prefix — การเพิ่มคำนำหน้า
ใช้ names_prefix เพื่อเติมสตริงไว้ด้านหน้าชื่อคอลัมน์ใหม่ทั้งหมด วิธีนี้ช่วยหลีกเลี่ยงปัญหาเมื่อค่าใน names_from เป็นตัวเลข หรือเมื่อคุณต้องการให้ชื่อคอลัมน์สื่อความหมายมากขึ้น
library(tidyr)
df <- data.frame(
student = c('Alice','Alice','Bob','Bob'),
quarter = c(1, 2, 1, 2),
score = c(85, 90, 78, 82)
)
# Without prefix: columns named '1' and '2' (problematic)
# With prefix: q1, q2
pivot_wider(
df,
names_from = quarter,
values_from = score,
names_prefix = 'q'
)คอลัมน์ values_from หลายคอลัมน์
คุณสามารถปรับรูปแบบคอลัมน์ค่าหลายคอลัมน์พร้อมกันได้โดยส่งเวกเตอร์ให้กับ values_from คอลัมน์ที่ได้จะตั้งชื่อในรูปแบบ value_name ซึ่งรวมชื่อคอลัมน์ค่าเข้ากับหมวดหมู่
library(tidyr)
df <- data.frame(
region = c('East','East','West','West'),
period = c('Q1','Q2','Q1','Q2'),
revenue = c(100, 120, 200, 210),
units = c(10, 12, 20, 22)
)
pivot_wider(
df,
names_from = period,
values_from = c(revenue, units)
)การจัดการค่าซ้ำด้วย values_fn
หากมีค่าหลายค่าที่ใช้ชุด id + name เดียวกัน pivot_wider จะไม่ทราบว่าควรเลือกค่าใด และจะส่งคืนคอลัมน์แบบรายการพร้อมคำเตือน ใช้ values_fn เพื่อแก้ปัญหานี้โดยระบุฟังก์ชันการรวมค่า
library(tidyr)
# Duplicate rows: Alice has two Q1 scores
df <- data.frame(
student = c('Alice','Alice','Alice','Bob','Bob'),
quarter = c('Q1','Q1','Q2','Q1','Q2'),
score = c(85, 87, 90, 78, 82)
)
# Resolve duplicates by taking the mean
pivot_wider(
df,
names_from = quarter,
values_from = score,
values_fn = mean
)values_fn กับรายการที่มีชื่อกำกับ
ส่งรายการที่มีชื่อกำกับให้กับ values_fn เพื่อใช้ฟังก์ชันการรวมค่าที่แตกต่างกันกับคอลัมน์ค่าแต่ละคอลัมน์พร้อมกัน วิธีนี้มีประโยชน์มากเมื่อปรับรูปแบบคอลัมน์ค่าหลายคอลัมน์ที่ต้องใช้วิธีสรุปผลต่างกัน
library(tidyr)
df <- data.frame(
region = c('East','East','West','West'),
period = c('Q1','Q1','Q1','Q1'),
revenue = c(100, 120, 200, 210),
orders = c(10, 12, 20, 22)
)
pivot_wider(
df,
names_from = period,
values_from = c(revenue, orders),
values_fn = list(revenue = sum, orders = sum)
)การสร้างตารางไขว้
คุณสามารถสร้างตารางไขว้ (ตารางแจกแจงความถี่ร่วม) ในรูปแบบ data frame ได้อย่างง่ายดายด้วย pivot_wider() หลังจากนับจำนวนด้วย dplyr::count() วิธีนี้ผสานความสามารถของทั้งสองแพ็กเกจเพื่อวิเคราะห์ความถี่
library(tidyr)
library(dplyr)
survey <- data.frame(
dept = c('HR','HR','Eng','Eng','HR','Eng'),
response = c('Yes','No','Yes','Yes','Yes','No')
)
survey %>%
count(dept, response) %>%
pivot_wider(
names_from = response,
values_from = n,
values_fill = 0
)ไปกลับ: แบบยาว → แบบกว้าง → แบบยาว
การเข้าใจความสัมพันธ์แบบผกผันระหว่าง pivot_longer() และ pivot_wider() ช่วยตรวจจับข้อผิดพลาดได้ การแปลงไปกลับ (แบบยาว→แบบกว้าง→แบบยาว) ควรได้ข้อมูลเดิมกลับมา โดยอาจต่างกันที่ลำดับแถวและการแปลงชนิดข้อมูล
library(tidyr)
original_long <- data.frame(
id = c(1,1,2,2),
key = c('a','b','a','b'),
value = c(10, 20, 30, 40)
)
# Go wide
wide <- pivot_wider(original_long, names_from=key, values_from=value)
print(wide)
# Go long again
pivot_longer(wide, -id, names_to='key', values_to='value')ตัวอย่างใช้งานจริง: รายงานคะแนน
กรณีใช้งานทั่วไปคือ นำตารางคะแนนการทดสอบแบบยาวมาปรับรูปแบบเป็นตารางรายงานที่จัดตามนักเรียนและวิชา ใช้ร่วมกับ dplyr::arrange() และ rename() เพื่อสร้างผลลัพธ์ที่เรียบร้อยและพร้อมนำเสนอ
library(tidyr)
library(dplyr)
scores <- data.frame(
student = c('Alice','Alice','Bob','Bob','Carol','Carol'),
subject = c('Math','Science','Math','Science','Math','Science'),
score = c(92, 88, 85, 91, 79, 83)
)
scores %>%
pivot_wider(names_from=subject, values_from=score) %>%
mutate(average = round((Math + Science) / 2, 1)) %>%
arrange(desc(average))ตรวจสอบความเข้าใจ
จะเกิดอะไรขึ้นเมื่อคุณเรียกใช้ pivot_wider() แล้วมีค่าหลายค่าที่ใช้ชุด id + name เดียวกัน
สรุป: pivot_wider()
ประเด็นสำคัญสำหรับการแปลงจากแบบยาวเป็นแบบกว้าง:
pivot_wider(names_from, values_from)กระจายคอลัมน์คีย์ออกเป็นคอลัมน์ใหม่หลายคอลัมน์id_colsระบุคอลัมน์ที่ใช้ระบุแต่ละแถวvalues_fill = 0(หรือค่าคงที่ใด ๆ) เติมชุดค่าผสมที่หายไปnames_prefixเติมสตริงไว้ด้านหน้าเพื่อหลีกเลี่ยงชื่อคอลัมน์ที่เป็นตัวเลขหรือกำกวมvalues_fnแก้ปัญหาค่าในเซลล์ซ้ำด้วยฟังก์ชันการรวมค่า- ส่งเวกเตอร์ให้กับ
values_fromเพื่อปรับรูปแบบคอลัมน์ค่าหลายคอลัมน์พร้อมกัน - ใช้หลัง
count()เพื่อสร้างตารางไขว้ได้อย่างมีประสิทธิภาพ
library(tidyr)
library(dplyr)
data.frame(
region = c('East','East','West','West'),
metric = c('revenue','units','revenue','units'),
value = c(100, 10, 200, 20)
) %>%
pivot_wider(
names_from = metric,
values_from = value,
values_fill = 0
) %>%
mutate(revenue_per_unit = revenue / units)คำถามที่พบบ่อย
บทเรียน “จากแบบยาวเป็นแบบกว้างด้วย pivot_wider()” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “จากแบบยาวเป็นแบบกว้างด้วย pivot_wider()” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “จากแบบยาวเป็นแบบกว้างด้วย pivot_wider()”
กระจายคู่คีย์-ค่ากลับเป็นตารางรูปแบบกว้าง คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “จากแบบยาวเป็นแบบกว้างด้วย pivot_wider()” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม
ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- จากแบบกว้างเป็นแบบยาวด้วย pivot_longer()
- จากแบบยาวเป็นแบบกว้างด้วย pivot_wider()
- separate() และ unite() สำหรับคอลัมน์สตริง
- การซ้อนและคลายการซ้อนดาต้าเฟรม