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

จากแบบกว้างเป็นแบบยาวด้วย pivot_longer()

ปรับรูปร่างตารางแบบกว้างให้เป็นรูปแบบยาวที่เป็นระเบียบเพื่อการวิเคราะห์

จากแบบกว้างเป็นแบบยาวด้วย pivot_longer() เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

รูปแบบข้อมูลกว้างเทียบกับแบบยาว

ข้อมูลสามารถจัดเก็บในรูปแบบกว้าง (หนึ่งแถวต่อหน่วยข้อมูล และมีหลายคอลัมน์ค่า) หรือรูปแบบยาว (หนึ่งแถวต่อการสังเกตการณ์ มีคอลัมน์หนึ่งสำหรับชื่อตัวแปรและอีกคอลัมน์สำหรับค่า) แพ็กเกจ R จำนวนมากสำหรับการแสดงผลและการสร้างแบบจำลองต้องการข้อมูลรูปแบบยาว

library(tidyr)
library(dplyr)

# Wide format: each quarter is a column
wide_df <- data.frame(
  student = c('Alice','Bob','Carol'),
  q1 = c(85, 90, 78),
  q2 = c(88, 85, 80),
  q3 = c(92, 88, 84)
)

print(wide_df)
cat('\nShape:', nrow(wide_df), 'rows x', ncol(wide_df), 'cols')

พื้นฐานของ pivot_longer()

pivot_longer(df, cols, names_to, values_to) แปลงข้อมูลจากรูปแบบกว้างเป็นรูปแบบยาว cols ระบุคอลัมน์ที่จะปรับรูปแบบ names_to คือคอลัมน์ใหม่สำหรับชื่อคอลัมน์เดิม และ values_to คือคอลัมน์ใหม่สำหรับค่า

library(tidyr)

wide_df <- data.frame(
  student = c('Alice','Bob','Carol'),
  q1 = c(85, 90, 78),
  q2 = c(88, 85, 80),
  q3 = c(92, 88, 84)
)

long_df <- pivot_longer(
  wide_df,
  cols = c(q1, q2, q3),
  names_to = 'quarter',
  values_to = 'score'
)

print(long_df)

การเลือกคอลัมน์ด้วย starts_with()

แทนที่จะระบุคอลัมน์ทีละรายการ ให้ใช้ตัวช่วย tidyselect ภายใน cols โดย starts_with('prefix'), ends_with('suffix') และ contains('string') มีประโยชน์อย่างยิ่งสำหรับการปรับรูปแบบคอลัมน์ที่ตั้งชื่ออย่างสม่ำเสมอ

library(tidyr)

df <- data.frame(
  id = 1:3,
  sales_jan = c(100, 200, 150),
  sales_feb = c(120, 180, 160),
  sales_mar = c(130, 190, 170)
)

# Select all sales_ columns automatically
pivot_longer(
  df,
  cols = starts_with('sales_'),
  names_to = 'month',
  values_to = 'sales'
)

การยกเว้นคอลัมน์ด้วย -col

อีกวิธีหนึ่งคือระบุคอลัมน์ที่ต้องการยกเว้นจากการปรับรูปแบบด้วย -col_name คอลัมน์อื่นทั้งหมดจะถูกปรับรูปแบบ วิธีนี้สะดวกเมื่อมีคอลัมน์ ID เพียงหนึ่งหรือสองคอลัมน์ แต่มีคอลัมน์ค่าจำนวนมาก

library(tidyr)

df <- data.frame(
  region = c('East','West'),
  jan = c(100, 200),
  feb = c(110, 210),
  mar = c(120, 220),
  apr = c(130, 230)
)

# Pivot everything except 'region'
pivot_longer(df, cols = -region, names_to = 'month', values_to = 'revenue')

names_prefix — การตัดคำนำหน้า

เมื่อชื่อคอลัมน์มีคำนำหน้า เช่น score_q1, score_q2 อาร์กิวเมนต์ names_prefix จะตัดคำนำหน้านั้นออกจากคอลัมน์ names_to ที่สร้างขึ้น ทำให้ตัวระบุมีความกระชับและสะอาด

library(tidyr)

df <- data.frame(
  id = 1:3,
  score_q1 = c(85, 90, 78),
  score_q2 = c(88, 85, 80),
  score_q3 = c(92, 88, 84)
)

pivot_longer(
  df,
  cols = starts_with('score_'),
  names_to = 'quarter',
  names_prefix = 'score_',
  values_to = 'score'
)

การปรับรูปแบบคอลัมน์หลายชุด

เมื่อมีคอลัมน์ค่าหลายกลุ่ม (เช่นทั้ง sales_q1 และ cost_q1) ให้ใช้ names_to พร้อมค่าหลายรายการ และใช้ names_pattern เพื่อแยกชื่อคอลัมน์ออกเป็นส่วน ๆ

library(tidyr)

df <- data.frame(
  id = 1:2,
  sales_q1 = c(100, 200),
  sales_q2 = c(110, 210),
  cost_q1 = c(60, 110),
  cost_q2 = c(65, 115)
)

pivot_longer(
  df,
  cols = -id,
  names_to = c('.value', 'quarter'),
  names_pattern = '(.+)_(q[0-9]+)'
)

names_transform — การแปลงชนิดข้อมูล

โดยค่าเริ่มต้น คอลัมน์ชื่อใหม่จะเป็นชนิดอักขระ ใช้ names_transform เพื่อแปลงคอลัมน์ชื่อให้เป็นชนิดอื่นโดยอัตโนมัติ (เช่น แปลงปีจากชื่อคอลัมน์อย่าง y2020, y2021 ให้เป็นจำนวนเต็ม)

library(tidyr)

df <- data.frame(
  product = c('A','B'),
  y2021 = c(100, 200),
  y2022 = c(110, 210),
  y2023 = c(120, 220)
)

result <- pivot_longer(
  df,
  cols = -product,
  names_to = 'year',
  names_prefix = 'y',
  names_transform = list(year = as.integer),
  values_to = 'sales'
)

print(result)
cat('year column type:', class(result$year))

values_drop_na — การลบค่าที่หายไป

เมื่อรูปแบบกว้างมีค่าที่หายไปสำหรับชุดคอลัมน์กับแถวบางชุด ค่าเหล่านั้นจะปรากฏเป็น NA ในรูปแบบยาว กำหนด values_drop_na = TRUE เพื่อลบแถวที่ค่าคือ NA โดยอัตโนมัติ

library(tidyr)

df <- data.frame(
  student = c('Alice','Bob','Carol'),
  q1 = c(85, NA, 78),
  q2 = c(88, 85, NA),
  q3 = c(NA, 88, 84)
)

# Without drop: 9 rows including NAs
pivot_longer(df, -student, names_to='quarter', values_to='score',
             values_drop_na = TRUE)

รูปแบบยาวช่วยให้ใช้ ggplot2 ได้

เหตุผลสำคัญที่สุดที่ควรแปลงเป็นรูปแบบยาวคือ ggplot2 จะจับคู่คุณลักษณะจากคอลัมน์ เมื่อค่าทั้งหมดอยู่ในคอลัมน์เดียวและหมวดหมู่ของค่าอยู่ในอีกคอลัมน์หนึ่ง คุณจะใช้ color = quarter หรือ facet_wrap(~quarter) ได้อย่างสะดวก

library(tidyr)
# (ggplot2 not run here, but showing the data preparation)

df <- data.frame(
  month = c('Jan','Feb','Mar'),
  product_A = c(100, 120, 110),
  product_B = c(200, 190, 210)
)

# After pivoting, ready for ggplot2:
long_df <- pivot_longer(df, -month, names_to='product', values_to='sales')
print(long_df)
# ggplot(long_df, aes(x=month, y=sales, color=product)) + geom_line()

การปรับรูปแบบโดยมีชื่อคอลัมน์เป็นตัวเลข

บางครั้งชื่อคอลัมน์เป็นตัวเลขล้วน (เช่น ปี: 2020, 2021) ใน R ชื่อคอลัมน์ที่เป็นตัวเลขจะต้องใส่เครื่องหมายคำพูดในกรอบข้อมูล ใช้ num_range('', 2020:2023) หรือใส่เครื่องหมาย backtick ในอาร์กิวเมนต์ cols เพื่อจัดการชื่อเหล่านี้

library(tidyr)

# Year columns as numbers (common in census-style data)
df <- data.frame(
  country = c('US','UK'),
  '2021' = c(100, 80),
  '2022' = c(110, 85),
  '2023' = c(120, 90),
  check.names = FALSE
)

pivot_longer(
  df,
  cols = c('2021','2022','2023'),
  names_to = 'year',
  values_to = 'gdp_index'
)

การเปรียบเทียบผลลัพธ์จากการปรับรูปแบบ

หลังการปรับรูปแบบ ให้ตรวจสอบผลลัพธ์ดังนี้ จำนวนแถวควรเป็น nrow(wide) * n_pivoted_cols และค่าที่ไม่ซ้ำกันในคอลัมน์ names_to ควรตรงกับชื่อคอลัมน์เดิม (ลบคำนำหน้าออก หากมีการตัดคำนำหน้า)

library(tidyr)

wide <- data.frame(
  id = 1:4,
  jan = c(10,20,30,40),
  feb = c(11,21,31,41),
  mar = c(12,22,32,42)
)

long <- pivot_longer(wide, -id, names_to='month', values_to='value')

cat('Wide rows:', nrow(wide), '\n')
cat('Long rows:', nrow(long), '(expected', nrow(wide)*3, ')\n')
cat('Months:', paste(unique(long$month), collapse=', '), '\n')

ตรวจสอบความเข้าใจ

อาร์กิวเมนต์ names_prefix ใน pivot_longer() ทำหน้าที่อะไร

สรุป: pivot_longer()

ประเด็นสำคัญของการแปลงจากรูปแบบกว้างเป็นรูปแบบยาว:

  • pivot_longer(df, cols, names_to, values_to) คือฟังก์ชันหลัก
  • cols รองรับ tidyselect: starts_with(), -id_col, c('a','b')
  • names_prefix ตัดสตริงที่อยู่ต้นชื่อคอลัมน์ออก
  • names_transform แปลงชนิดข้อมูลของคอลัมน์ชื่อ (เช่น เป็นจำนวนเต็ม)
  • values_drop_na = TRUE ลบแถวที่มีค่า NA โดยอัตโนมัติ
  • รูปแบบยาวเป็นรูปแบบที่ ggplot2 ฟังก์ชันสร้างแบบจำลองส่วนใหญ่ และการทดสอบทางสถิติต้องการ
  • ตรวจสอบความถูกต้อง: จำนวนแถวแบบยาว = จำนวนแถวแบบกว้าง × จำนวนคอลัมน์ที่ปรับรูปแบบ
library(tidyr)

df <- data.frame(
  team = c('Alpha','Beta'),
  sales_2022 = c(100, 200),
  sales_2023 = c(120, 220),
  sales_2024 = c(140, 240)
)

pivot_longer(
  df,
  cols = starts_with('sales_'),
  names_to = 'year',
  names_prefix = 'sales_',
  names_transform = list(year = as.integer),
  values_to = 'revenue'
)

คำถามที่พบบ่อย

บทเรียน “จากแบบกว้างเป็นแบบยาวด้วย pivot_longer()” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “จากแบบกว้างเป็นแบบยาวด้วย pivot_longer()” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “จากแบบกว้างเป็นแบบยาวด้วย pivot_longer()”

ปรับรูปร่างตารางแบบกว้างให้เป็นรูปแบบยาวที่เป็นระเบียบเพื่อการวิเคราะห์ คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “จากแบบกว้างเป็นแบบยาวด้วย pivot_longer()” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม

ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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