안녕하세요. 우주신입니다!


데이터를 다루기 전에 항상 데이터 구조를 먼저 살펴보고 그 다음 결측값 및 특이값들을 처리해줘야 합니다.


오늘은 이 골칫덩어리들(NA, NULL, NaN, Inf, -Inf 등)에 대해 정리해보겠습니다.


is.na(), is.nan(), is.infinite(), is.finite(), colSums(), na.rm=T, na.omit(), complete.cases()



1. NA, NULL, NaN, Inf 구분


우선, 설명을 위해 인위적인 데이터프레임을 하나 만들어보았습니다.


-X 변수에는 NA 를 넣었습니다. NANot Available의 약자로써 결측값 입니다. 

-Y 변수에는 NULL 을 넣었습니다. 그러나 데이터프레임을 보면 NULL이 들어가있지 않습니다. NULL값이 없다는 뜻 입니다. 즉, 값이 존재하지 않는 것이죠. 

-Z 변수에는 1/0, -1/0, 0/0의 결과값인 Inf, -Inf, NaN을 넣었습니다. InfInfinite의 약자로써 무한대를 의미합니다. 1 나누기 0은 양의 무한으로, -1 나누기 0은 음의 무한으로 정의가 된거죠. NaNNot a Number의 약자로써 0/0처럼 수학적으로 정의가 되지 않는 것을 의미합니다.


NA와 NaN은 하나의 '값'으로 인식하는 반면 NULL은 값 자체가 없다고 생각하면 쉬울 것 같습니다. 

그래서 길이를 보더라도 NULL은 0이지만 NA와 NaN은 1로 표시됩니다.

문제는 NA, NaN, Inf, -Inf 문자들이 들어가 있는 상태에서 통계분석을 진행하면 오류가 뜨기 때문입니다.

NULL이 들어간 Y는 평균값이 나오지만 나머지는 결측값으로 나타납니다.



2. 데이터 확인


결측값 및 무한값을 확인하는 함수로는 is.na(), is.nan(), is.infinite()이 있습니다.

-is.na(X): 4번째 NA 값은 TRUE로 뜸

-is.na(Y): NULL은 애초에 값 자체가 아니기에 데이터 구성요소로서 들어가지도 않음

-is.na(Z): is.na()함수는 NaN도 TRUE로 인식 (is.nan(Z)을 입력해도 결과값은 같게 나옴)

-is.infinite(Z): Inf와 -Inf가 TRUE로 뜸


이렇게 간단한 벡터나 데이터프레임은 TRUE, FALSE로 결측값 및 무한값을 확인할 수 있지만, 큰 용량의 데이터프레임을 일일이 다 이렇게 확인할 수는 없겠죠?


이 때는 colSums() 함수를 사용하면 됩니다.

-colSums(is.na(df)): df라는 데이터프레임 변수들의 결측값이 각각 몇개인지 보여줌

같은 원리로 무한값을 확인하고 싶을 때는 colSums(is.infinite(df)) 를 입력하면 됩니다.



3. 데이터 처리


데이터를 처리하는 방법 중 하나는 na.rm = TRUE를 덧붙여주는 것 입니다.

 


아니면 애초에 NA 값이 들어있는 행을 모두 제거해주는 함수 na.omit()을 사용할 수도 있습니다.

NA가 포함되어 있던 4행과 NaN이 포함되어 있던 3행이 모두 제거됐습니다.


특정 변수를 선택해 결측값이 포함되어 있는 행을 지우는 함수로는 complete.cases()이 있습니다.

df의 변수 중 X 변수의 결측값이 포함되어 있는 행을 제거했습니다.


데이터 제거 뿐만 아니라 그 값을 대체할 수도 있습니다.

dataframe[is.na(dataframe)] <- 새로운 값

기존의 df의 결측값이 모두 0으로 대체 됐습니다.


무한값도 같은 원리로 is.infinite()로만 바꿔주시면 됩니다.


마지막으로 결측값의 수를 확인해보면

모두 처리가 된 것을 알 수 있습니다.





끝.


수고하셨습니다~

  1. sean 2017.11.23 08:48

    잘 보고 있습니다. 좋은 자료와 자세한 설명 정말 감사합니다.^^

  2. R아가기 2019.07.20 20:39

    좋은 콘텐츠 감사합니다! 이해 쉽게 너무 잘 설명해주셔서 도움이 많이 돼요!

  3. 덕담 2021.02.07 12:56

    늘 혼돈이 오던 부분이었는데, 명확하게 정리가 되었습니다. 감사합니다.

+ Recent posts