Part 10 — Missing Values

Memahami dan menangani missing values (NA) di R: deteksi, filter, imputation, dan best practices.
Fundamental
MissingValues
Diterbitkan

26 Februari 2026

Fundamental Series — Part 10 of 20

Data dunia nyata hampir selalu punya missing values. Memahami bagaimana R memperlakukan NA sangat penting — karena NA bisa “menular” ke seluruh perhitungan.


Apa itu NA?

x <- NA
class(x)    # "logical"
is.na(x)    # TRUE

# NA punya tipe
NA_real_      # NA numerik
NA_integer_   # NA integer
NA_character_ # NA string
NA_complex_   # NA complex

NA itu “Menular”

1 + NA        # NA
NA > 5        # NA
NA == NA      # NA (!)
paste("a", NA) # "a NA"

# Hati-hati di statistik!
x <- c(1, 2, NA, 4, 5)
mean(x)         # NA
mean(x, na.rm = TRUE)   # 3
sum(x, na.rm = TRUE)    # 12
PentingNA == NA menghasilkan NA!

Jangan pernah cek missing dengan x == NA. Selalu gunakan is.na(x).


Deteksi Missing

x <- c(1, NA, 3, NA, 5)

is.na(x)        # FALSE TRUE FALSE TRUE FALSE
!is.na(x)       # TRUE FALSE TRUE FALSE TRUE
sum(is.na(x))   # 2
any(is.na(x))   # TRUE

Dalam DataFrame

library(dplyr)

df <- data.frame(
  nama = c("A", "B", "C", "D"),
  nilai = c(80, NA, 70, NA),
  umur = c(20, 21, NA, 22)
)

# Hitung NA per kolom
colSums(is.na(df))
# nama: 0, nilai: 2, umur: 1

# Baris mana yang punya NA?
complete.cases(df)
# TRUE FALSE FALSE FALSE

Filter Missing

library(dplyr)

# Buang baris dengan NA di kolom tertentu
df |> filter(!is.na(nilai))

# Buang baris dengan NA di kolom mana saja
df |> na.omit()
df |> tidyr::drop_na()

# Buang NA hanya di kolom tertentu
df |> tidyr::drop_na(nilai)

Mengisi Missing

library(dplyr)
library(tidyr)

# Isi dengan nilai tetap
df |> replace_na(list(nilai = 0, umur = 99))

# Isi dengan mean
df |> mutate(nilai = ifelse(is.na(nilai), mean(nilai, na.rm = TRUE), nilai))

# Isi dengan coalesce (ambil nilai non-NA pertama)
coalesce(NA, NA, 3, 5)   # 3

# fill — isi ke bawah/atas (time series)
df |> fill(nilai, .direction = "down")

NULL vs NA

# NULL = tidak ada / kosong
x <- NULL
length(x)     # 0
is.null(x)    # TRUE

# NA = ada tapi tidak diketahui
y <- NA
length(y)     # 1
is.na(y)      # TRUE

# NULL hilang di vector, NA tidak
c(1, NULL, 3)   # c(1, 3)
c(1, NA, 3)     # c(1, NA, 3)

Latihan

BahayaLatihan 10.1 — Deteksi & Hitung
df <- data.frame(
  id = 1:10,
  x = c(5, NA, 3, NA, 7, 8, NA, 2, 9, NA),
  y = c(NA, 10, NA, 20, 30, NA, 40, 50, NA, 60)
)

# 1. Berapa total NA di seluruh dataframe?
# 2. Kolom mana yang paling banyak NA?
# 3. Berapa persen baris yang complete (tanpa NA)?
BahayaLatihan 10.2 — Handle Missing
# Dari df di atas:
# 1. Buat df_complete: hanya baris tanpa NA
# 2. Buat df_filled: isi NA di x dengan mean(x), NA di y dengan median(y)
# 3. Bandingkan mean(x) di df_complete vs df_filled

Ringkasan

Fungsi Keterangan
NA Nilai missing
is.na(x) Cek NA
na.rm = TRUE Abaikan NA di statistik
complete.cases() Baris tanpa NA
na.omit() / drop_na() Buang baris NA
replace_na() Isi NA dengan nilai
coalesce() Ambil non-NA pertama
fill() Isi ke bawah/atas

Sebelumnya: Part 9 — Date & Time Selanjutnya: Part 11 — Package & Library