การนำค่า NA ออกและแทนที่ค่า NA
ใช้ na.omit(), complete.cases() และกลยุทธ์การแทนที่ด้วยตนเอง
การนำค่า NA ออกและแทนที่ค่า NA เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
กลยุทธ์สำหรับจัดการ NA
มีกลยุทธ์หลักสามประการสำหรับจัดการค่าหายไป ได้แก่ ลบค่าเหล่านั้นออก แทนที่ด้วยค่าคงที่ หรือ เติมค่าทดแทนโดยใช้ค่าประมาณทางสถิติ วิธีที่เหมาะสมขึ้นอยู่กับข้อมูลและเป้าหมายการวิเคราะห์ของคุณ
data_vals <- c(88, NA, 72, NA, 91, 65, NA, 78)
cat('Original data:', data_vals, '
')
cat('NA count:', sum(is.na(data_vals)), '
')
# Strategy 1: remove
cat('After removal:', data_vals[!is.na(data_vals)], '
')
# Strategy 2: replace with 0
replaced <- data_vals; replaced[is.na(replaced)] <- 0
cat('Replaced with 0:', replaced, '
')การลบ NA ด้วย x[!is.na(x)]
วิธีที่ตรงไปตรงมาที่สุดในการลบ NA ออกจากเวกเตอร์คือการเลือกสมาชิกด้วยตรรกะ: x[!is.na(x)] วิธีนี้จะเก็บเฉพาะสมาชิกที่ is.na(x) มีค่าเป็น FALSE (กล่าวคือ เป็นค่าที่มีข้อมูล)
response_times <- c(1.2, NA, 0.9, 1.5, NA, 1.1, 0.8, NA, 1.3)
cat('With NAs: ', response_times, '
')
cat('Length:', length(response_times), '
')
clean_times <- response_times[!is.na(response_times)]
cat('Without NAs: ', clean_times, '
')
cat('Length:', length(clean_times), '
')
cat('Mean after removal:', round(mean(clean_times), 3), '
')na.omit() สำหรับเวกเตอร์
na.omit(x) ลบค่า NA ออกจากเวกเตอร์ มีผลเทียบเท่ากับ x[!is.na(x)] แต่ยังจัดเก็บตำแหน่งของ NA ที่ถูกลบไว้ในแอตทริบิวต์ชื่อ 'na.action'
scores <- c(88, NA, 72, NA, 91, 65, NA, 78)
clean_scores <- na.omit(scores)
cat('Original:', scores, '
')
cat('Cleaned: ', as.numeric(clean_scores), '
')
# na.omit records which positions were removed
removed_at <- attr(clean_scores, 'na.action')
cat('NAs were at positions:', removed_at, '
')na.omit() สำหรับกรอบข้อมูล
เมื่อใช้กับกรอบข้อมูล na.omit(df) จะลบทุกแถวที่มี NA อย่างน้อยหนึ่งค่า วิธีนี้เรียกว่า การลบทั้งรายการ — ข้อมูลหนึ่งรายการจะถูกลบออกทั้งหมด
df <- data.frame(
name = c('Alice', 'Bob', 'Carol', 'Dave', 'Eve'),
age = c(28, NA, 32, 45, 29),
salary = c(55000, 72000, NA, 90000, 61000)
)
cat('Original rows:', nrow(df), '
')
df_clean <- na.omit(df)
cat('After na.omit rows:', nrow(df_clean), '
')
print(df_clean)complete.cases() — ความครบถ้วนรายแถว
complete.cases(df) คืนค่าเวกเตอร์ตรรกะที่มีค่า TRUE สำหรับแถวที่ไม่มีค่าหายไป ใช้ฟังก์ชันนี้เพื่อกรองแถวที่สมบูรณ์ หรือระบุว่าแถวใดมีข้อมูลไม่ครบ
df <- data.frame(
id = 1:5,
x = c(1, NA, 3, 4, NA),
y = c(NA, 2, 3, NA, 5)
)
cc <- complete.cases(df)
cat('Complete cases (T/F):', cc, '
')
cat('Complete rows:
')
print(df[cc, ])
cat('Number complete:', sum(cc), '
')การแทนที่ NA ด้วยค่าคงที่
หากต้องการแทนที่ NA ด้วยค่าเฉพาะ ให้ใช้การกำหนดค่าด้วยตรรกะ: x[is.na(x)] <- value ค่าที่นิยมใช้แทน ได้แก่ 0 สำหรับจำนวน ค่าเฉลี่ยหรือมัธยฐานสำหรับข้อมูลต่อเนื่อง หรือป้ายกำกับหมวดหมู่สำหรับตัวแปรแบบปัจจัย
# Replace with 0
counts <- c(5, NA, 3, NA, 8, 1, NA, 4)
counts_filled <- counts
counts_filled[is.na(counts_filled)] <- 0
cat('Original:', counts, '
')
cat('Filled: ', counts_filled, '
')
# Replace with mean of present values
mean_val <- mean(counts, na.rm = TRUE)
counts_mean <- counts
counts_mean[is.na(counts_mean)] <- mean_val
cat('Mean-filled:', round(counts_mean, 1), '
')replace() — การแทนที่ด้วยฟังก์ชัน
replace(x, list, values) คืนสำเนาที่แก้ไขแล้วของ x โดยสมาชิกตามตำแหน่งใน list จะถูกแทนที่ด้วย values นี่คือแนวทางการแทนที่แบบฟังก์ชัน ซึ่งไม่แก้ไขออบเจ็กต์เดิม
temps <- c(22.1, NA, 19.8, NA, 25.1)
cat('Original:', temps, '
')
# Replace NAs with the median
median_temp <- median(temps, na.rm = TRUE)
filled_temps <- replace(temps, is.na(temps), median_temp)
cat('Filled: ', filled_temps, '
')
cat('Original unchanged:', temps, '
') # original not modifiedการเติมค่าจากด้านหน้า (ค่าที่สังเกตล่าสุดส่งต่อไปข้างหน้า)
กลยุทธ์การเติมค่าทดแทนที่ใช้กันทั่วไปคือ การเติมค่าจากด้านหน้า (LOCF): แทนที่ NA แต่ละค่าด้วยค่าที่ทราบล่าสุด วิธีนี้ใช้กับข้อมูลอนุกรมเวลา ซึ่งค่าที่วัดได้จะถูกส่งต่อไปจนกว่าจะมีการอัปเดต
# Manual forward-fill
readings <- c(10, NA, NA, 13, NA, 15, NA, NA, 18)
filled <- readings
for (i in seq_along(filled)) {
if (is.na(filled[i]) && i > 1) {
filled[i] <- filled[i - 1]
}
}
cat('Original: ', readings, '
')
cat('Forward-filled:', filled, '
')การแทนที่ NA ในเวกเตอร์ข้อความ
เทคนิคเดียวกันนี้ใช้ได้กับเวกเตอร์ข้อความ การแทนที่ NA ในข้อความด้วยป้ายกำกับอย่าง 'Unknown' หรือ 'Missing' เป็นแนวทางที่พบได้ทั่วไปในการวิเคราะห์ข้อมูลแบบจัดหมวดหมู่
categories <- c('A', NA, 'B', 'A', NA, 'C', NA, 'B')
cat('Original:', categories, '
')
# Replace with 'Unknown'
filled_cat <- replace(categories, is.na(categories), 'Unknown')
cat('Filled: ', filled_cat, '
')
# Count each category
cat('Table:
')
print(table(filled_cat))กลยุทธ์การแทนที่ตามเงื่อนไข
บางครั้งคุณอาจต้องการใช้ค่าที่แทนที่แตกต่างกันตามค่าของคอลัมน์อื่น ให้ใช้การสร้างดัชนีร่วมกับเงื่อนไขเพื่อดำเนินการแทนที่แบบเจาะจง
# Scores: replace NA with group mean
group <- c('A', 'A', 'B', 'B', 'A', 'B')
scores <- c(85, NA, 72, NA, 90, 78)
mean_a <- mean(scores[group == 'A'], na.rm = TRUE)
mean_b <- mean(scores[group == 'B'], na.rm = TRUE)
imputed <- scores
imputed[is.na(imputed) & group == 'A'] <- mean_a
imputed[is.na(imputed) & group == 'B'] <- mean_b
cat('Original:', scores, '
')
cat('Imputed: ', imputed, '
')สรุปวิธีการลบ NA
สรุปเครื่องมือจัดการ NA ใน R:
x[!is.na(x)]— ลบ NA ออกจากเวกเตอร์na.omit(x)— ลบ NA (และบันทึกตำแหน่งไว้ด้วย)na.omit(df)— ลบแถวที่มีข้อมูลไม่ครบจากกรอบข้อมูลcomplete.cases(df)— เวกเตอร์ตรรกะ: เป็น TRUE สำหรับแถวที่สมบูรณ์x[is.na(x)] <- val— แทนที่ NA โดยตรงในออบเจ็กต์เดิมreplace(x, is.na(x), val)— การแทนที่แบบฟังก์ชัน (คืนสำเนา)
v <- c(5, NA, 8, NA, 3, 7)
cat('Remove: ', v[!is.na(v)], '
')
cat('Replace with 0: ', replace(v, is.na(v), 0), '
')
cat('Replace with mean:', replace(v, is.na(v), mean(v, na.rm=TRUE)), '
')ตรวจสอบอย่างรวดเร็ว
na.omit(c(1, NA, 3, NA, 5)) คืนค่าอะไร?
ทบทวน: การลบและแทนที่ NA
ทำได้ดีมากครับ/ค่ะ! ประเด็นสำคัญจากบทเรียนนี้มีดังนี้:
x[!is.na(x)]และna.omit(x)ลบ NA ออกจากเวกเตอร์na.omit(df)ดำเนินการลบทั้งรายการ (ลบทุกแถวที่มี NA)complete.cases(df)ระบุแถวที่ไม่มีค่าหายไปx[is.na(x)] <- valueแทนที่ NA โดยตรงในออบเจ็กต์เดิมreplace(x, is.na(x), value)คืนสำเนาที่แก้ไขแล้วโดยไม่เปลี่ยนออบเจ็กต์เดิม- เลือกกลยุทธ์ตามสาเหตุที่ข้อมูลหายไปและปริมาณข้อมูลที่หายไป
# Complete workflow: audit, then handle
data_raw <- c(82, NA, 75, NA, 91, 68, NA, 79)
cat('Missing:', sum(is.na(data_raw)), '/', length(data_raw), '
')
# Replace with median (robust to outliers)
imputed <- replace(data_raw, is.na(data_raw), median(data_raw, na.rm=TRUE))
cat('Before imputation mean:', round(mean(data_raw, na.rm=TRUE), 2), '
')
cat('After imputation mean: ', round(mean(imputed), 2), '
')คำถามที่พบบ่อย
บทเรียน “การนำค่า NA ออกและแทนที่ค่า NA” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การนำค่า NA ออกและแทนที่ค่า NA” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การนำค่า NA ออกและแทนที่ค่า NA”
ใช้ na.omit(), complete.cases() และกลยุทธ์การแทนที่ด้วยตนเอง คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การนำค่า NA ออกและแทนที่ค่า NA” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม
ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ทำความเข้าใจ NA ใน R
- การตรวจหาและนับค่าที่หายไป
- การนำค่า NA ออกและแทนที่ค่า NA
- NA ในการคำนวณและการรวมค่า