0Pricing
R Academy · 강의

NA 값 제거 및 대체

na.omit(), complete.cases(), 수동 대체 전략을 적용합니다.

NA 값 제거 및 대체은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 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, '
')

x[!is.na(x)]로 NA 제거하기

벡터에서 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)는 list 위치의 원소를 values로 대체한 x의 수정된 복사본을 반환합니다. 원본을 직접 수정하지 않는 함수형 대체 방법입니다.

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

앞으로 채우기(Last Observation Carried Forward)

일반적인 대치 전략 중 하나는 앞으로 채우기(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 제거 방법 요약

R의 NA 처리 도구 요약:

  • 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 값 제거 및 대체” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“NA 값 제거 및 대체”에서 뭘 배우나요?

na.omit(), complete.cases(), 수동 대체 전략을 적용합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“NA 값 제거 및 대체” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. R에서 NA 이해하기
  2. 결측값 감지 및 개수 세기
  3. NA 값 제거 및 대체
  4. 계산과 집계에서의 NA
← R Academy(으)로 돌아가기