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 propagatesNA와 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), '
') # FALSENA와 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), '
') # NAtypeof(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_), '
') # characterNA_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.4NA 형식 한눈에 이해하기
다음은 R에서 NA와 관련된 특수값을 요약한 내용입니다.
NA— 일반 결측값(논리 형식)NA_integer_,NA_real_,NA_complex_,NA_character_— 형식이 지정된 NANaN— 정의되지 않은 수(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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- R에서 NA 이해하기
- 결측값 감지 및 개수 세기
- NA 값 제거 및 대체
- 계산과 집계에서의 NA