R 에서 범주형 데이터의 숫자를 숫자형 데이터로 바꾸기

R 에서 범주형 데이터의 숫자를 숫자형 데이터로 바꾸기

개요

숫자임에도 불구하고 범주형 자료로 읽혀서 연속형 데이터로 바꾸고 싶은데 생각대로 되지 않는 이들을 위한 팁이다. 이 포스트는 지면 대부분을 그 원리를 설명하기 위해 할애하고 있으므로 결론만 필요하면 아래의 실전 예시부터 읽기를 추천한다.

참고로, 보통 자료형을 바꿀 때는 Cast라는 표현을 사용한다.

원리

R 을 이용해서 통계분석을 할 때 가장 중요한것은 테크닉 이전에 데이터 자체를 이해하는 것이다.

20180327\_122310.png

아이리스 데이터를 불러온 후 데이터를 확인하고 그 구조str ucture를 확인한 모습이다. 이렇듯 str() 함수를 사용하면 데이터의 칼럼들이 각자 어떤 형태고 그 예시가 무엇인지 간략하게 설명해준다. head()처럼 보기 좋은 모양은 아니지만 변수가 많아질수록 한 눈에 들어오고 자료형도 파악할 수 있어 쓸 일이 많다. 그래서 str() 하나면 만능일 것 같지만 데이터가 방대하고 복잡할수록 특이한 예는 많아지고, 하나하나 확인할 일이 생긴다.

20180327\_124419.png

그래서 필요한 것이 is.X() 함수들과 class() 함수다. is.X()는 주어진 인자가 X인지 아닌지를 불리언으로 반환해주고, 인자가 여러개라면 모두 X인지를 판정한다. class()는 구체적으로 어떤 자료형인지 문자열로 반환해준다.

20180327\_124802.png

한편 as.X() 함수는 주어진 인자를 가능한 한 X로 변환해준다. 비슷하게 숫자로 적힌 범주형 데이터 역시 as.numeric()으로 변환하면 끝날 것 같지만, 그 이전에 범주형 데이터를 이해해야한다.

실전 예시

다음의 예시를 보자:

20180327\_130132.png

x1은 제대로 변환되지 않았지만 x2는 의도하던 그대로 변화되었음에 주목하자. 그 원리는 다음과 같다.

보시다시피 범주화된 데이터는 수로써 어떤 의미도 없고 나눠진 계급 중 하나에 속할 뿐이다. 그러므로 as.numeric()으로 바꾸더라도 범주라는 점에 입각해 자연수에 일대일 대응이 이루어지게 된다. 생각해보면 $\left\{ a, 2, c , \cdots , z_{2} \right\}$ 같은 범주에도 대응하기 위해선 이러한 방식이 가장 합당하다.

따라서 주어진 수를 그대로 유지하기 위해선 우선 문자열로 변환한 뒤에 수로 변환할 필요가 있다. 수로 이루어진 범주가 문자열로 변환될 땐 딱히 자연수에 대응하지 않고 그대로를 받아오므로 정보의 손실이 없고, 수로 이루어진 문자열이 수로 변환될 땐 딱히 새로운 수를 만들어낼 필요가 없기 때문에 정보의 손실이 없다.

함수들과 자료형을 잘 이해하고 있으면 데이터 핸들링에 있어서 유용한 여러가지 트릭을 사용할 수 있게 된다. 당장 직접적으로 통계랑 상관없다고 경시해선 안될 소중한 무기인 것이다.

코드

아래는 예제 코드다.

example<-iris
head(example)
str(example)
 
is.numeric(example$Sepal.Length)
is.character(example$Sepal.Length)
class(example$Sepal.Length)
 
is.numeric(example$Species)
is.character(example$Species)
class(example$Species)
 
is.numeric(example)
is.character(example)
class(example)
 
one<-'1'
is.numeric(one)
is.character(one)
class(one)
 
one<-as.numeric(one)
class(one)
is.numeric(one)
is.character(one)
class(one)
 
x<-as.factor(c(1,2,3,128,67915)); x
x1<-as.numeric(x); x1
is.numeric(x1)
x2<-as.numeric(as.character(x)); x2
is.numeric(x2)
댓글