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

การตรวจหาและนับค่าที่หายไป

ใช้ is.na(), anyNA() และ sum(is.na()) เพื่อตรวจสอบข้อมูลที่หายไป

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

is.na() — เครื่องมือหลักสำหรับตรวจหา

is.na(x) ตรวจสอบแต่ละสมาชิกของ x และคืนค่าเป็น เวกเตอร์ตรรกะที่มีความยาวเท่ากัน โดยให้ค่า TRUE เมื่อค่านั้นเป็น NA (หรือ NaN) นี่คือเครื่องมือพื้นฐานสำหรับตรวจหาค่าหายไป

heights <- c(175, NA, 162, 188, NA, 170, NA, 165)
cat('Heights:', heights, '
')
cat('is.na() :', is.na(heights), '
')
cat('!is.na():', !is.na(heights), '
')

การนับ NA ด้วย sum(is.na())

เนื่องจาก TRUE == 1 และ FALSE == 0 ในการคำนวณเลขคณิต sum(is.na(x)) จึงใช้ นับจำนวนค่าหายไปทั้งหมดได้ ส่วน mean(is.na(x)) ให้สัดส่วนของค่าหายไป

survey <- c(8, NA, 6, NA, 9, 7, NA, 5, NA, 8)
cat('Survey responses:', survey, '
')
cat('Total NAs:    ', sum(is.na(survey)), '
')
cat('Total present:', sum(!is.na(survey)), '
')
cat('NA proportion:', mean(is.na(survey)), '
')
cat('NA percentage:', mean(is.na(survey)) * 100, '%
')

anyNA() — ตรวจสอบการมีอยู่แบบรวดเร็ว

anyNA(x) คืนค่า TRUE เพียงค่าเดียวหากสมาชิกใด ๆ เป็น NA มิฉะนั้นจะคืนค่า FALSE ฟังก์ชันนี้เร็วกว่าการใช้ any(is.na(x)) เพราะจะหยุดทันทีที่พบ NA ตัวแรก

complete_data <- c(1, 2, 3, 4, 5)
incomplete_data <- c(1, 2, NA, 4, 5)

cat('anyNA(complete)  :', anyNA(complete_data), '
')    # FALSE
cat('anyNA(incomplete):', anyNA(incomplete_data), '
')  # TRUE

# Use in validation
if (anyNA(incomplete_data)) {
  cat('Warning: data contains missing values!
')
}

which(is.na()) — ค้นหาตำแหน่ง

which(is.na(x)) คืนค่า ดัชนี (ตำแหน่ง) ของค่าหายไปในเวกเตอร์ ซึ่งจำเป็นสำหรับตรวจสอบว่าข้อมูลรายการใดหายไป และสำหรับการเติมค่าทดแทนแบบเจาะจง

temperatures <- c(22.1, NA, 19.8, NA, 25.1, NA, 17.3, 20.0)
cat('Temperatures:', temperatures, '
')

missing_pos <- which(is.na(temperatures))
cat('Missing at positions:', missing_pos, '
')
cat('Number missing:', length(missing_pos), '
')

# What values are NOT missing?
present_pos <- which(!is.na(temperatures))
cat('Present at positions:', present_pos, '
')

การนับ NA ในกรอบข้อมูล

สำหรับกรอบข้อมูล is.na(df) จะคืนค่าเมทริกซ์ตรรกะที่มีมิติเท่ากัน การใช้ร่วมกับ colSums() จะให้จำนวนค่าหายไปในแต่ละคอลัมน์ ซึ่งเป็นวิธีตรวจสอบคุณภาพข้อมูลได้อย่างรวดเร็ว

# Simulate a small data frame
name_col <- c('Alice', 'Bob', 'Carol', 'Dave', 'Eve')
age_col  <- c(28, NA, 32, NA, 29)
sal_col  <- c(55000, 72000, NA, 90000, 61000)
scr_col  <- c(88, NA, 75, NA, NA)

cat('Age NAs:   ', sum(is.na(age_col)), '
')
cat('Salary NAs:', sum(is.na(sal_col)), '
')
cat('Score NAs: ', sum(is.na(scr_col)), '
')

รูปแบบ colSums(is.na(df))

รูปแบบ colSums(is.na(df)) เป็นวิธีที่รวดเร็วที่สุดในการนับค่าหายไปในแต่ละคอลัมน์ของกรอบข้อมูล โดยคืนค่าเป็นเวกเตอร์ตัวเลขที่มีชื่อ ซึ่งแสดงจำนวน NA ในแต่ละคอลัมน์

# Build a data frame manually
df <- data.frame(
  name   = c('Alice', 'Bob', 'Carol', 'Dave', 'Eve'),
  age    = c(28, NA, 32, NA, 29),
  salary = c(55000, 72000, NA, 90000, 61000),
  score  = c(88, NA, 75, NA, NA)
)
cat('Missing values per column:
')
print(colSums(is.na(df)))
cat('Total missing:', sum(is.na(df)), '
')

สัดส่วน NA ในแต่ละคอลัมน์

การหารด้วยจำนวนแถวจะให้ สัดส่วนของค่าหายไปในแต่ละคอลัมน์ ซึ่งให้ข้อมูลมากกว่าจำนวนดิบเมื่อคอลัมน์มีความยาวต่างกัน

df <- data.frame(
  x1 = c(1, NA, 3, NA, 5),
  x2 = c(NA, 2, NA, 4, NA),
  x3 = c(1, 2, 3, NA, 5)
)
n_rows <- nrow(df)
na_counts <- colSums(is.na(df))
na_pct <- round(na_counts / n_rows * 100, 1)

cat('NA counts:     '); print(na_counts)
cat('NA percentage: '); print(na_pct)

table(is.na()) — การนับความถี่

table(is.na(x)) สร้างตารางความถี่ที่มีชื่อ โดยแสดงจำนวนค่า FALSE (มีข้อมูล) และ TRUE (หายไป) วิธีนี้อ่านและทำความเข้าใจได้ง่ายในทันที

responses <- c(5, NA, 8, 6, NA, 9, 7, NA, NA, 8)

cat('NA frequency table:
')
print(table(is.na(responses)))

# For multiple columns:
cat('Age table:
')
ages <- c(28, NA, 32, NA, 29)
print(table(is.na(ages)))

การค้นหาแถวที่มี NA อย่างน้อยหนึ่งค่า

หากต้องการค้นหาว่าแถวใดในกรอบข้อมูลมีค่าหายไปอย่างน้อยหนึ่งค่า ให้ใช้ apply(is.na(df), 1, any) ผลลัพธ์คือเวกเตอร์ตรรกะที่มีค่า TRUE สำหรับแถวที่มีข้อมูลไม่ครบ

df <- data.frame(
  id     = 1:5,
  age    = c(28, NA, 32, NA, 29),
  salary = c(55000, 72000, NA, 90000, 61000)
)

# Which rows have at least one NA?
has_na <- apply(is.na(df), 1, any)
cat('Rows with any NA:', which(has_na), '
')
cat('Complete rows:   ', which(!has_na), '
')
cat('Complete row count:', sum(!has_na), '/', nrow(df), '
')

การตรวจสอบชุดข้อมูลที่สมบูรณ์

กระบวนการตรวจสอบ NA ที่ใช้ได้จริงคือ นับ ค้นหาตำแหน่ง และรายงานค่าหายไป เพื่อทำความเข้าใจคุณภาพข้อมูลก่อนการวิเคราะห์ ต่อไปนี้คือฟังก์ชันตรวจสอบแบบครบถ้วนในตัวเอง

audit_na <- function(v, label) {
  n_total   <- length(v)
  n_missing <- sum(is.na(v))
  pct       <- round(n_missing / n_total * 100, 1)
  positions <- which(is.na(v))
  cat(label, ':', n_missing, '/', n_total,
      '(', pct, '%) NA at positions', positions, '
')
}

heights <- c(175, NA, 162, 188, NA, 170)
weights <- c(70, 85, NA, 92, 68, NA)
audit_na(heights, 'Height')
audit_na(weights, 'Weight')

สรุปการตรวจหา NA

ข้อมูลอ้างอิงอย่างรวดเร็วสำหรับเครื่องมือตรวจหา NA:

  • is.na(x) — เวกเตอร์ตรรกะ: เป็น TRUE เมื่อเป็น NA
  • anyNA(x) — ค่า TRUE/FALSE เดียว: มี NA อยู่หรือไม่
  • sum(is.na(x)) — จำนวน NA
  • mean(is.na(x)) — สัดส่วนของ NA
  • which(is.na(x)) — ตำแหน่งของ NA
  • colSums(is.na(df)) — จำนวน NA ในแต่ละคอลัมน์
  • table(is.na(x)) — ตารางความถี่ของค่า NA และค่าที่ไม่ใช่ NA
x <- c(10, NA, 30, NA, 50, NA, 70)
cat('is.na:       ', is.na(x), '
')
cat('anyNA:       ', anyNA(x), '
')
cat('sum(is.na):  ', sum(is.na(x)), '
')
cat('mean(is.na): ', mean(is.na(x)), '
')
cat('which(is.na):', which(is.na(x)), '
')

ตรวจสอบอย่างรวดเร็ว

sum(is.na(c(1, NA, 3, NA, 5))) คืนค่าอะไร?

ทบทวน: การตรวจหาและนับ NA

ทำได้ดีมากครับ/ค่ะ! ประเด็นสำคัญจากบทเรียนนี้มีดังนี้:

  • is.na(x) เป็นเครื่องมือหลัก — คืนค่าเวกเตอร์ตรรกะ
  • sum(is.na(x)) นับค่าหายไป ส่วน mean(is.na(x)) ให้สัดส่วน
  • anyNA(x) ใช้ตรวจสอบอย่างรวดเร็วว่ามี NA อยู่หรือไม่
  • which(is.na(x)) แสดงตำแหน่งที่แน่นอนของ NA
  • colSums(is.na(df)) เป็นวิธีมาตรฐานสำหรับตรวจสอบกรอบข้อมูล
  • อย่าใช้ x == NA เพื่อตรวจหา NA — ให้ใช้ is.na(x) เสมอ
# Full audit of a data frame in 3 lines
df <- data.frame(a=c(1,NA,3), b=c(NA,2,NA), c=c(1,2,3))
cat('Per column:', colSums(is.na(df)), '
')
cat('Total:     ', sum(is.na(df)), '/', nrow(df)*ncol(df), '
')
cat('Complete rows:', sum(complete.cases(df)), '/', nrow(df), '
')

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

บทเรียน “การตรวจหาและนับค่าที่หายไป” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การตรวจหาและนับค่าที่หายไป”

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

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

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

บทเรียน “การตรวจหาและนับค่าที่หายไป” ใช้เวลานานแค่ไหน

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

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

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

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

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