R Academy · บทเรียน

ทำความเข้าใจ NA ใน R

เรียนรู้ความหมายของ NA เหตุผลที่ NA แพร่ต่อไป และความแตกต่างระหว่าง NA กับ NULL

บทเรียน 1 จาก 413 ขั้นตอน

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

NA ใน R คืออะไร

NA ย่อมาจาก Not Available ซึ่งหมายถึงค่าที่ขาดหายไปหรือไม่ทราบค่า ต่างจาก NULL (ไม่มีวัตถุ) หรือ NaN (ไม่ใช่จำนวน) ตรงที่ NA เป็นตัวแทนของข้อมูลที่มีอยู่แต่ไม่ทราบค่า

# NA represents a missing value
height_cm <- c(175, NA, 162, 188, NA, 170)
cat('Heights:', height_cm, '
')
cat('Length:', length(height_cm), '
')  # NA counts as an element
cat('Sum:', sum(height_cm), '
')        # NA propagates

NA กับ NULL

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

# NA: element exists, value unknown
vec_with_na <- c(1, NA, 3)
cat('Vector with NA, length:', length(vec_with_na), '
')  # 3

# NULL: nothing there at all
vec_with_null <- c(1, NULL, 3)
cat('Vector with NULL, length:', length(vec_with_null), '
')  # 2!

# NULL gets dropped; NA is kept
cat('vec_with_na:', vec_with_na, '
')
cat('vec_with_null:', vec_with_null, '
')

NA กับ NaN

NaN (Not a Number) เกิดจากการดำเนินการทางคณิตศาสตร์ที่ไม่กำหนดความหมาย เช่น 0/0 หรือ sqrt(-1) ค่านี้เป็นค่าตัวเลขพิเศษ ขณะที่ NA เป็นเครื่องหมายแสดงค่าที่ขาดหายไปทั่วไป ซึ่งใช้ได้กับข้อมูลทุกชนิด

# NaN from undefined operations
cat('0/0 =', 0/0, '
')          # NaN
cat('sqrt(-1) =', sqrt(-1), '
') # NaN (with warning)
cat('Inf - Inf =', Inf - Inf, '
') # NaN

# NaN IS also NA (a special case)
cat('is.nan(NaN):', is.nan(NaN), '
')
cat('is.na(NaN): ', is.na(NaN), '
')  # TRUE!
cat('is.nan(NA): ', is.nan(NA), '
')  # FALSE

NA เทียบกับ Inf

Inf และ -Inf ใช้แทนค่าอนันต์บวกและอนันต์ลบ — ค่าทั้งสองเกิดจากการดำเนินการ เช่น 1/0 ซึ่งแตกต่างจาก NA ตรงที่ Inf เป็นค่าตัวเลขที่ทราบแน่ชัด (แม้จะมีขนาดสุดขั้ว) และเข้าร่วมการเปรียบเทียบได้ตามปกติ

cat('1/0 =', 1/0, '
')         # Inf
cat('-1/0 =', -1/0, '
')       # -Inf
cat('Inf + 1 =', Inf + 1, '
') # Inf
cat('Inf > 1000:', Inf > 1000, '
')  # TRUE
cat('is.infinite(Inf):', is.infinite(Inf), '
')
cat('is.na(Inf):       ', is.na(Inf), '
')  # FALSE

การส่งต่อ NA ในการคำนวณเลขคณิต

NA มีคุณสมบัติ แพร่กระจายในการคำนวณเลขคณิต กล่าวคือ การดำเนินการใด ๆ ที่เกี่ยวข้องกับ NA จะคืนค่าเป็น NA ทั้งหมด ซึ่งเป็นพฤติกรรมที่ตั้งใจไว้ — หากค่าหนึ่งในการคำนวณไม่ทราบ ผลลัพธ์ก็ย่อมไม่ทราบเช่นกัน

x <- NA
cat('NA + 5:  ', x + 5, '
')      # NA
cat('NA * 0:  ', x * 0, '
')      # NA (not 0!)
cat('NA == NA:', x == NA, '
')     # NA (not TRUE!)
cat('NA > 5:  ', x > 5, '
')      # NA
cat('sum(1,NA):', sum(1, NA), '
') # NA

typeof(NA) — NA ที่มีชนิดข้อมูล

NA ตามค่าเริ่มต้นมีชนิดเป็น logical โดย R มีรูปแบบ NA ที่ระบุชนิดสำหรับชนิดข้อมูลพื้นฐานแต่ละชนิด ซึ่งสำคัญเมื่อทำงานกับเวกเตอร์ที่มีชนิดข้อมูลชัดเจน เพื่อหลีกเลี่ยงการแปลงชนิดข้อมูลโดยไม่ตั้งใจ

cat('typeof(NA):            ', typeof(NA), '
')           # logical
cat('typeof(NA_integer_):  ', typeof(NA_integer_), '
')   # integer
cat('typeof(NA_real_):     ', typeof(NA_real_), '
')      # double
cat('typeof(NA_complex_):  ', typeof(NA_complex_), '
')   # complex
cat('typeof(NA_character_):', typeof(NA_character_), '
') # character

การใช้ NA_integer_ ในทางปฏิบัติ

เมื่อสร้างเวกเตอร์จำนวนเต็มที่มีค่าหายไป ให้ใช้ NA_integer_ เพื่อรักษาชนิดของเวกเตอร์ให้ถูกต้อง การใช้ NA แบบทั่วไปอาจทำให้เกิดการแปลงชนิดข้อมูลโดยปริยายเป็น double ในบางบริบท

# Using plain NA in an integer vector
v1 <- c(1L, 2L, NA, 4L)
cat('typeof with NA:         ', typeof(v1), '
')  # integer (OK here)

# Explicit typed NA is safer in functions
v2 <- c(1L, 2L, NA_integer_, 4L)
cat('typeof with NA_integer_:', typeof(v2), '
')  # integer

# Check they behave the same
cat('Same?', identical(v1, v2), '
')

NA_real_ และ NA_character_

ใช้ NA_real_ สำหรับค่าหายไปในเวกเตอร์ double (numeric) และใช้ NA_character_ สำหรับข้อความที่หายไป ค่าเหล่านี้สำคัญอย่างยิ่งเมื่อสร้างเวกเตอร์ภายในฟังก์ชันที่ต้องรักษาความสอดคล้องของชนิดข้อมูล

# Character vector with missing
names_vec <- c('Alice', 'Bob', NA_character_, 'Dave')
cat('Names:', names_vec, '
')
cat('typeof:', typeof(names_vec), '
')

# Numeric with missing
readings <- c(22.5, NA_real_, 21.3, NA_real_, 24.1)
cat('Readings:', readings, '
')
cat('Non-NA count:', sum(!is.na(readings)), '
')

NA ในการดำเนินการทางตรรกะ

การมี NA ในการดำเนินการทางตรรกะเป็นไปตาม ตรรกะแบบสามค่า: TRUE | NA ให้ผลเป็น TRUE (เพราะ TRUE OR ค่าใด ๆ ย่อมเป็น TRUE) แต่ FALSE | NA ให้ผลเป็น NA (เราไม่สามารถระบุผลลัพธ์ได้หากไม่ทราบค่าของ NA)

cat('TRUE  | NA:', TRUE | NA, '
')   # TRUE
cat('FALSE | NA:', FALSE | NA, '
')  # NA
cat('TRUE  & NA:', TRUE & NA, '
')   # NA
cat('FALSE & NA:', FALSE & NA, '
')  # FALSE

# Never use == to test for NA!
cat('NA == NA:', NA == NA, '
')    # NA (not TRUE!)
cat('is.na(NA):', is.na(NA), '
')  # TRUE (correct way)

NA ในเวกเตอร์และกรอบข้อมูล

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

ages <- c(25, NA, 32, NA, 29, 41, NA, 35)
cat('Ages:', ages, '
')
cat('Length:', length(ages), '
')
cat('Missing count:', sum(is.na(ages)), '
')
cat('Present count:', sum(!is.na(ages)), '
')
cat('Mean (fails):', mean(ages), '
')           # NA
cat('Mean (works):', mean(ages, na.rm = TRUE), '
') # 32.4

ชนิดของ NA: ภาพรวมทั้งหมด

ต่อไปนี้คือสรุปค่าพิเศษที่เกี่ยวข้องกับ NA ใน R:

  • NA — ค่าหายไปทั่วไป (ชนิด logical)
  • NA_integer_, NA_real_, NA_complex_, NA_character_ — NA ที่ระบุชนิดข้อมูล
  • NaN — ตัวเลขที่ไม่กำหนด (ผลลัพธ์จาก 0/0, sqrt(-1))
  • Inf, -Inf — ค่าอนันต์ (ผลลัพธ์จาก 1/0)
  • NULL — การไม่มีออบเจ็กต์ (ความยาว 0)
# Test functions for special values
x <- c(1, NA, NaN, Inf, -Inf, 0)
cat('Values:         ', x, '
')
cat('is.na():        ', is.na(x), '
')        # TRUE for NA and NaN
cat('is.nan():       ', is.nan(x), '
')       # TRUE only for NaN
cat('is.infinite():  ', is.infinite(x), '
')  # TRUE for Inf and -Inf
cat('is.finite():    ', is.finite(x), '
')    # TRUE only for normal numbers

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

NA == NA ให้ผลลัพธ์เป็นอะไรใน R?

ทบทวน: ทำความเข้าใจ NA

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

  • NA = ค่าหายไป (ทราบว่ามีค่าอยู่ แต่ไม่ทราบค่าที่แท้จริง)
  • NULL = การไม่มีออบเจ็กต์ (ถูกนำออกจากเวกเตอร์)
  • NaN = ผลลัพธ์การคำนวณที่ไม่กำหนด (และเป็น NA ด้วย)
  • Inf / -Inf = ค่าอนันต์ (ไม่ใช่ NA)
  • NA แพร่กระจายในการคำนวณเลขคณิต — การดำเนินการกับ NA จะคืนค่าเป็น NA
  • ใช้ NA ที่ระบุชนิดข้อมูล (NA_integer_ เป็นต้น) เพื่อให้โค้ดปลอดภัยด้านชนิดข้อมูล
  • ตรวจสอบ NA ด้วย is.na() เสมอ และอย่าใช้ == NA
# Key tests side by side
special_vals <- list(NA=NA, NaN=NaN, Inf=Inf, 'NULL-in-vec'=c(1,NULL,3)[2])
for (name in names(special_vals)) {
  v <- special_vals[[name]]
  cat(name, '| is.na:', is.na(v), '| is.nan:', is.nan(v[!is.infinite(v)]), '
')
}
เริ่มต้นได้ฟรี

เรียนรู้ R ด้วย AI tutor — ฟรี

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

คอร์ส
43
บทเรียน
159

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

บทเรียน “ทำความเข้าใจ NA ใน R” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ทำความเข้าใจ NA ใน R”

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

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

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

บทเรียน “ทำความเข้าใจ NA ใน R” ใช้เวลานานแค่ไหน

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

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

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

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

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