สรุปข้อมูลแบบจัดกลุ่มและ group_by()
รวมข้อมูลตามกลุ่มและคำนวณสถิติของแต่ละกลุ่ม
สรุปข้อมูลแบบจัดกลุ่มและ group_by() เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงต้องจัดกลุ่มข้อมูล
การจัดกลุ่มข้อมูลเป็นหนึ่งในการดำเนินการที่ทรงพลังที่สุดในการวิเคราะห์ข้อมูล แทนที่จะคำนวณสถิติจากชุดข้อมูลทั้งหมด คุณจะคำนวณภายในแต่ละกลุ่ม แพ็กเกจ dplyr ทำให้แนวคิดนี้เข้าใจง่ายด้วย group_by() ตามด้วย summarize()
library(dplyr)
# Sample sales data
sales <- data.frame(
region = c('North','North','South','South','East'),
revenue = c(120, 95, 200, 175, 88),
units = c(10, 8, 15, 12, 7)
)
print(sales)พื้นฐานของ group_by()
group_by(col) ทำเครื่องหมายดาตาเฟรมเพื่อให้การดำเนินการถัดไปเกิดขึ้นแยกตามกลุ่ม ฟังก์ชันนี้ไม่ได้เปลี่ยนแปลงข้อมูล แต่เพิ่มข้อมูลเมตาของการจัดกลุ่ม คุณสามารถจัดกลุ่มตามคอลัมน์เดียวหรือหลายคอลัมน์ได้
library(dplyr)
sales <- data.frame(
region = c('North','North','South','South','East'),
revenue = c(120, 95, 200, 175, 88),
units = c(10, 8, 15, 12, 7)
)
# Group by region
grouped <- sales %>% group_by(region)
print(grouped)
print(group_keys(grouped))summarize() หลัง group_by()
summarize() (หรือ summarise()) ยุบแต่ละกลุ่มให้เหลือหนึ่งแถว คุณระบุชื่อคอลัมน์ใหม่และฟังก์ชันสรุปที่จะใช้ได้ ฟังก์ชันที่ใช้บ่อย ได้แก่ n(), mean(), sum(), min() และ max()
library(dplyr)
sales <- data.frame(
region = c('North','North','South','South','East'),
revenue = c(120, 95, 200, 175, 88),
units = c(10, 8, 15, 12, 7)
)
sales %>%
group_by(region) %>%
summarize(
n = n(),
mean_revenue = mean(revenue),
total_units = sum(units)
)การนับด้วย n()
n() ภายใน summarize() จะส่งคืนจำนวนแถวในแต่ละกลุ่ม โดยไม่ต้องรับอาร์กิวเมนต์ หากต้องการนับแถวที่ตรงตามเงื่อนไข ให้ใช้ sum(condition) ส่วน n_distinct(col) ใช้นับค่าที่ไม่ซ้ำกัน
library(dplyr)
employees <- data.frame(
dept = c('HR','HR','Eng','Eng','Eng','Sales'),
salary = c(55000, 60000, 95000, 105000, 90000, 70000),
senior = c(FALSE, TRUE, TRUE, TRUE, FALSE, FALSE)
)
employees %>%
group_by(dept) %>%
summarize(
count = n(),
senior_count = sum(senior),
avg_salary = mean(salary)
)การจัดกลุ่มตามหลายคอลัมน์
คุณสามารถส่งหลายคอลัมน์ให้กับ group_by() ได้ กลุ่มจะถูกสร้างจากชุดค่าผสมทุกแบบที่ปรากฏในข้อมูล วิธีนี้มีประโยชน์สำหรับตารางไขว้และสรุปข้อมูลแบบลำดับชั้น
library(dplyr)
orders <- data.frame(
region = c('North','North','South','South','North','South'),
product = c('A','B','A','B','A','A'),
sales = c(100, 200, 150, 250, 120, 180)
)
orders %>%
group_by(region, product) %>%
summarize(
total_sales = sum(sales),
orders = n(),
.groups = 'drop'
)อาร์กิวเมนต์ .groups
หลังจากใช้ summarize() ผลลัพธ์จะยังคงจัดกลุ่มตามตัวแปรจัดกลุ่มทั้งหมด ยกเว้นตัวสุดท้าย อาร์กิวเมนต์ .groups ใช้ควบคุมพฤติกรรมนี้:
'drop_last'— ค่าเริ่มต้น ลบระดับกลุ่มสุดท้าย'drop'— ลบการจัดกลุ่มทั้งหมด'keep'— คงการจัดกลุ่มทั้งหมดไว้
library(dplyr)
df <- data.frame(
year = c(2022,2022,2023,2023),
quarter = c('Q1','Q2','Q1','Q2'),
revenue = c(100, 120, 130, 150)
)
# .groups = 'drop' ensures ungrouped result
result <- df %>%
group_by(year, quarter) %>%
summarize(total = sum(revenue), .groups = 'drop')
print(result)
print(is.grouped_df(result)) # FALSEungroup() อย่างชัดเจน
คุณสามารถเรียกใช้ ungroup() ได้ทุกเมื่อเพื่อลบข้อมูลเมตาของการจัดกลุ่มออกจากดาตาเฟรม ซึ่งสำคัญเมื่อคุณต้องการให้การดำเนินการถัดไปทำงานกับข้อมูลทั้งหมด ไม่ใช่แยกตามกลุ่ม
library(dplyr)
df <- data.frame(
dept = c('HR','HR','Eng','Eng'),
salary = c(55000, 60000, 95000, 105000)
)
# Without ungroup: rank is within group
df %>%
group_by(dept) %>%
mutate(rank_in_dept = rank(salary)) %>%
ungroup() %>%
mutate(rank_overall = rank(salary))group_keys() และ n_groups()
group_keys() จะส่งคืนดาตาเฟรมที่แสดงชุดค่าผสมของกลุ่มที่ไม่ซ้ำกัน ส่วน n_groups() จะบอกว่ามีกลุ่มอยู่กี่กลุ่ม ฟังก์ชันเหล่านี้มีประโยชน์สำหรับตรวจสอบโครงสร้างก่อนดำเนินการกับข้อมูลแบบจัดกลุ่ม
library(dplyr)
df <- data.frame(
country = c('US','US','UK','UK','DE'),
category = c('A','B','A','A','B'),
value = c(10, 20, 15, 25, 30)
)
grouped <- df %>% group_by(country, category)
cat('Number of groups:', n_groups(grouped), '\n')
print(group_keys(grouped))การสรุปด้วยสถิติหลายรายการ
คุณสามารถคำนวณสถิติสรุปหลายรายการได้ในคำสั่ง summarize() เดียว รวมการนับ ค่าเฉลี่ย มัธยฐาน ส่วนเบี่ยงเบนมาตรฐาน ค่าต่ำสุด ค่าสูงสุด และการคำนวณแบบกำหนดเองได้พร้อมกัน
library(dplyr)
scores <- data.frame(
class = c('A','A','A','B','B','B','C','C'),
score = c(85, 90, 78, 92, 88, 95, 70, 75)
)
scores %>%
group_by(class) %>%
summarize(
n = n(),
mean_score = round(mean(score), 1),
median_score = median(score),
sd_score = round(sd(score), 2),
min_score = min(score),
max_score = max(score)
)mutate() ที่คำนึงถึงกลุ่ม
mutate() หลัง group_by() จะคำนวณค่าภายในแต่ละกลุ่ม แต่ยังคงเก็บทุกแถวไว้ (ต่างจาก summarize()) เหมาะอย่างยิ่งสำหรับคำนวณตัวชี้วัดระดับกลุ่มที่ต้องการแนบไว้กับทุกแถว
library(dplyr)
sales <- data.frame(
region = c('East','East','West','West','West'),
rep = c('Alice','Bob','Carol','Dave','Eve'),
revenue = c(150, 200, 120, 180, 160)
)
sales %>%
group_by(region) %>%
mutate(
region_total = sum(revenue),
pct_of_region = round(100 * revenue / sum(revenue), 1)
) %>%
ungroup()การกรองภายในกลุ่ม
filter() หลัง group_by() จะกรองแถวตามเงื่อนไขระดับกลุ่ม ตัวอย่างเช่น เก็บเฉพาะผู้ทำผลงานสูงสุดในแต่ละภูมิภาค หรือแถวที่ค่ามากกว่าค่าเฉลี่ยของกลุ่ม
library(dplyr)
sales <- data.frame(
region = c('East','East','West','West','North','North'),
rep = c('Alice','Bob','Carol','Dave','Eve','Frank'),
revenue = c(150, 200, 120, 180, 95, 130)
)
# Keep the top rep per region
sales %>%
group_by(region) %>%
filter(revenue == max(revenue)) %>%
ungroup()ตรวจสอบด่วน
อาร์กิวเมนต์ .groups = 'drop' ใน summarize() ทำหน้าที่อะไร
ทบทวน: สรุปข้อมูลแบบจัดกลุ่ม
ประเด็นสำคัญจากการสรุปข้อมูลแบบจัดกลุ่ม:
group_by(col)เพิ่มการจัดกลุ่ม — ข้อมูลไม่เปลี่ยนแปลง แต่การดำเนินการจะคำนึงถึงกลุ่มsummarize()ยุบแต่ละกลุ่มให้เหลือหนึ่งแถว — ใช้n(),mean(),sum()และอื่น ๆ.groups = 'drop'ทำให้แน่ใจว่าผลลัพธ์ไม่มีการจัดกลุ่มungroup()ลบการจัดกลุ่มได้ทุกเมื่อgroup_keys()ตรวจสอบระดับกลุ่ม ส่วนn_groups()นับจำนวนกลุ่มmutate()+group_by()เพิ่มคอลัมน์ระดับกลุ่มโดยไม่ยุบแถว
library(dplyr)
# Full pipeline example
data.frame(
dept = c('Eng','Eng','HR','HR','Sales'),
salary = c(95000, 110000, 60000, 65000, 75000)
) %>%
group_by(dept) %>%
summarize(
headcount = n(),
avg_salary = mean(salary),
.groups = 'drop'
) %>%
arrange(desc(avg_salary))คำถามที่พบบ่อย
บทเรียน “สรุปข้อมูลแบบจัดกลุ่มและ group_by()” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “สรุปข้อมูลแบบจัดกลุ่มและ group_by()” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “สรุปข้อมูลแบบจัดกลุ่มและ group_by()”
รวมข้อมูลตามกลุ่มและคำนวณสถิติของแต่ละกลุ่ม คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “สรุปข้อมูลแบบจัดกลุ่มและ group_by()” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม
ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สรุปข้อมูลแบบจัดกลุ่มและ group_by()
- ฟังก์ชันหน้าต่าง: lag, lead, cumsum
- การเชื่อมหลายตารางใน dplyr
- การประเมินแบบเป็นระเบียบ: {{ }} และ .data