티스토리 뷰

Study/AI

[R] Basic DataType

생각많은 소심남 2015. 8. 6. 23:38

 R도 결국 프로그래밍을 해야 결과를 얻을 수 있는 부분이고, 여러가지 연산이 들어가다 보니 자연적으로 연산에 필요한 데이터를 어딘가에 저장할 곳이 필요하다. 당연히 여타 프로그래밍과 마찬가지로 DataType(자료형)이라는 걸 사용하게 되고, R에서는 대표적으로 3가지의 DataType을 많이 사용한다.

 - logical

 - numeric

 - character


 logical은 쉽게 말해서 논리적인 값을 말한다. C같은데서도 크게 True와 False라는 형태의 Boolean DataType을 지원하는데 R에서도 마찬가지로 TRUE와 FALSE 라는 상수로 logical을 표현한다. 그리고 다른거와 다르게 한가지가 logical 변수에 포함되는데 그게 NA(Not Available) 이라는 것이다. 말그대로 R에서 지원하는 어떤 DataType으로도 이걸 표현할 수 없다는 뜻을 나타낸다. 참고로 TRUE, FALSE를 다 쓰기 귀찮은 사람은 그냥 T, F라고 써도 R에선 자동으로 인식한다. 

 아 그리고 자기가 현재 사용하고 있는 변수의 DataType이 궁금한 사람은 class라는 함수를 사용하면 된다. 위의 예시를 사용해서 RStudio를 통해 보자면 다음과 같다.



다음은 Numeric이라는 Type인데, 말그대로 "숫자의" 라는 뜻의 DataType이다. 여기에는 2개의 SubType이 있는데 바로 double과 integer 라는 것이다. double은 보통 소숫점, integer는 정수형을 표현할 때 사용하는데, 일반적으로는 R에서 쓰이는 숫자는 대부분 numeric으로 인식된다. 단, 뒤에서 소개할 내용이지만 강제 형변환을 통해서 integer로 바꿨다던가 postfix 등을 통해서 명시했을 경우는 Integer라고 인식한다.

 Character는 문자로 표현된 데이터를 담은 모든 변수들을 말한다. 다른 프로그래밍에서는 string이라고 불리는 문자열도 character라고 말하고 실제로 class를 통해서 살펴보면 character로 인식된다. 이밖에도 complex value를 표현하는 complex 자료형, 순수 메모리에 저장되어 있는 데이터를 담는 raw type도 있긴 하지만, 아마 주로 코드들을 살펴보면 대부분 쓰이는 건 맨처음에 언급한 logical, numeric, character 이 3개다.


 그런데 사실 이 포스트에서 내가 설명하려고 했던건 이게 아니라, coercion(강제 형변환)이라는 것이다. R에선 as 클래스의 method로 자신이 원하는 형을 작성하고 인자로 변환하고자 하는 변수를 넣어주면 된다. 예를 들어서 numeric이 아닌 character "123"을 character "456"과 더하고 싶을 때는 그냥 바로 할 수 있는 것이 아니라 character를 numeric으로 바꿔준후 연산을 해줘야 한다는 것이다. 그래서 위의 연산을 하고자 할 경우는 다음과 같이

as.numeric("123") + as.numeric("456")

이런식으로 연산해줘야 한다. 다시한번 말하지만 123과 "123"은 다른 DataType을 가진 변수다. 궁금한 사람은 각각에 대해서 앞에서 언급한 class()함수를 써보면 그 변수가 무슨 DataType을 가지고 있는지를 확인할 수 있다. 또다른 특이한 예로는

as.logical(1)

을 하게 되면 1이란 값이 가지는 논리적인 값인 TRUE를 return하는 것이다. 그럼 2나 3, 혹은 음수를 집어넣으면 어떻게 될까? 마찬가지로 TRUE를 반환해준다. C를 배운 사람이라면 약간 이런 조건문 형식에 능할텐데 논리 연산에서는 0을 제외한 모든 값은 TRUE를 나타낸다. 그냥 이렇게만 기억을 해두면 좋을거 같다. 나같은 경우는 반대 케이스인 as.numeric(TRUE)나 as.numeric(FALSE)를 많이 사용했던것 같다. 그 이유는 사실 어떤 데이터를 처리할때 어떤 것에 대해서 TRUE를 가진 사람과 FALSE를 가진 사람을 구분짓고 table화 시킬때 이 함수를 통해서 숫자화시키고 계산했다. 이렇게 하면 조건부확률 같은 걸 구할 때도 생각한대로 결과를 구할 수 있었기 때문이다. 

 쉬운 내용인데, 간간히 까먹는거 같아서 짧게 정리했다.


* 아 그리고 이와 더불어서 많이 썼던 기본 함수중 하나가 is class에 있는 method들인데, 이 method들의 역할은 그게 참인지 거짓인지를 반환해주는 일종의 조건함수였다. 예를 들어서 

is.numeric("test")

와 같이 들어있는 인자가 numeric인지 아닌지를 검사해주고 그 결과를 logical로 나타내준다. 특히 잘 이용했던 건 is.na() 라는 건데, 이 함수의 역할은 인자로 들어있는 변수가 NA이냐 아니냐를 test하는 것이다. 그런데 사실 이 함수를 잘 사용하면 이전 포스트중에서 언급했던 Data Cleaning을 할때 유용하게 쓸 수 있다. 사실 데이터라는게 사용자가 원하는 데이터를 모두 가지고 있으면 best case겠지만, 정보를 수집하다보면 오류가 발생하거나 수집하지 못한 데이터들도 결과에 포함되기 마련이다. 이런건 위와 같이 test 함수를 통해서 걸러주고 그 안을 실제로 처리할 수 있는 데이터로 바꿔줘야 올바른 Data Analysis가 되는 것이다.  아무튼 난 좀 그렇게 많이 써먹었던 것 같다.

댓글