0Pricing
R Academy · 강의

R에서 NA 이해하기

NA의 의미와 전파되는 이유, NULL과 다른 점을 배웁니다.

R에서 NA 이해하기은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

R에서 NA란 무엇인가요?

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는 vector 내부의 누락된 값입니다. 해당 위치는 존재하지만 알려진 값이 없습니다. NULL은 객체가 완전히 존재하지 않음을 뜻합니다. 길이가 0이며 vector 내부에 저장할 수 없습니다.

# 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 형식 한눈에 이해하기

다음은 R에서 NA와 관련된 특수값을 요약한 내용입니다.

  • NA — 일반 결측값(논리 형식)
  • 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

빠른 확인

R에서 NA == NA는 어떤 결과로 평가될까요?

복습: 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에서 NA 이해하기” 강의는 무료인가요?

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

“R에서 NA 이해하기”에서 뭘 배우나요?

NA의 의미와 전파되는 이유, NULL과 다른 점을 배웁니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“R에서 NA 이해하기” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

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