3.3.4 NA 처리
3.3.4 NA 처리
이번 섹션에서는 R에서 결측값을 나타내는 NA와 정의되지 않은 연산 결과를 나타내는 NaN이 어떻게 처리되는지 알아볼게요. 이 둘은 비슷해 보이지만 타입과 동작 방식에서 중요한 차이가 있으니 잘 구분해야 해요.
출처: 문서
본문
통계적 의미의 결측값, 즉 값이 알려지지 않은 변수는 NA 값을 가져요. 이는 함수 인자가 제공되지 않았을 때의 missing 속성과 혼동하면 안 돼요 (Arguments 참조).
원자 벡터(atomic vector)의 원소는 모두 같은 타입이어야 하므로 NA 값에도 여러 타입이 존재해요. 사용자에게 특히 중요한 경우가 하나 있는데, NA의 기본 타입은 다른 타입으로 강제 변환되지 않는 한 logical이에요. 그래서 결측값이 나타나면 숫자형 인덱싱 대신 논리형 인덱싱이 유발될 수 있어요 (자세한 내용은 Indexing 참조).
NA가 포함된 숫자형 및 논리형 계산은 일반적으로 NA를 반환해요. 다만 NA가 취할 수 있는 모든 가능한 값에 대해 연산 결과가 동일한 경우에는 그 값을 반환할 수도 있어요. 특히 FALSE & NA는 FALSE이고, TRUE | NA는 TRUE예요. NA는 다른 어떤 값과도 같지 않고 자기 자신과도 같지 않아요. NA 여부를 검사할 때는 is.na를 사용해요.
하지만 match에서는 NA 값이 다른 NA 값과 매칭돼요.
0/0처럼 결과가 정의되지 않는 숫자 계산은 NaN 값을 생성해요. NaN은 double 타입과 complex 타입의 실수부·허수부에만 존재해요. is.nan 함수는 정확히 NaN인지 검사하기 위해 제공되며, is.na 역시 NaN에 대해 TRUE를 반환해요.
NaN을 논리형이나 정수형으로 강제 변환하면 해당 타입의 NA가 되지만, 문자형으로 강제 변환하면 문자열 "NaN"이 돼요. NaN 값은 비교가 불가능하므로 NaN이 포함된 동등성 비교나 정렬(collation) 검사는 결과가 NA가 돼요. match는 NaN이 다른 NaN 값과 매칭되는 것으로 간주해요 (다른 값, 심지어 NA와도 매칭되지 않아요).
문자 타입의 NA는 문자열 "NA"와 구별돼요. 명시적인 문자열 NA를 지정해야 하는 상황이라면, "NA" 대신 NA_character_를 사용하거나 is.na<-로 원소를 NA로 설정해야 해요.
NA_integer_, NA_real_, NA_complex_, NA_character_ 상수는 (파서에서) 해당 타입의 NA 값을 생성하며, 다른 방법으로는 NA의 타입을 식별할 수 없을 때 deparsing에 사용돼요 (control 옵션이 요청할 때예요).
raw 벡터에는 NA 값이 없어요.