0Pricing
R Academy · บทเรียน

จากแบบยาวเป็นแบบกว้างด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. จากแบบกว้างเป็นแบบยาวด้วย pivot_longer()
  2. จากแบบยาวเป็นแบบกว้างด้วย pivot_wider()
  3. separate() และ unite() สำหรับคอลัมน์สตริง
  4. การซ้อนและคลายการซ้อนดาต้าเฟรม
← กลับไปที่ R Academy