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

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

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

  1. ทำความเข้าใจ NA ใน R
  2. การตรวจหาและนับค่าที่หายไป
  3. การนำค่า NA ออกและแทนที่ค่า NA
  4. NA ในการคำนวณและการรวมค่า
← กลับไปที่ R Academy