R 에서 범주형 데이터의 숫자를 숫자형 데이터로 바꾸기
개요
숫자임에도 불구하고 범주형 자료로 읽혀서 연속형 데이터로 바꾸고 싶은데 생각대로 되지 않는 이들을 위한 팁이다. 이 포스트는 지면 대부분을 그 원리를 설명하기 위해 할애하고 있으므로 결론만 필요하면 아래의 실전 예시부터 읽기를 추천한다.
참고로, 보통 자료형을 바꿀 때는 Cast라는 표현을 사용한다.
원리
R 을 이용해서 통계분석을 할 때 가장 중요한것은 테크닉 이전에 데이터 자체를 이해하는 것이다.
아이리스 데이터를 불러온 후 데이터를 확인하고 그 구조str ucture를 확인한 모습이다. 이렇듯 str()
함수를 사용하면 데이터의 칼럼들이 각자 어떤 형태고 그 예시가 무엇인지 간략하게 설명해준다.
head()
처럼 보기 좋은 모양은 아니지만 변수가 많아질수록 한 눈에 들어오고 자료형도 파악할 수 있어 쓸 일이 많다. 그래서 str()
하나면 만능일 것 같지만 데이터가 방대하고 복잡할수록 특이한 예는 많아지고, 하나하나 확인할 일이 생긴다.
그래서 필요한 것이 is.X()
함수들과 class()
함수다. is.X()
는 주어진 인자가 X
인지 아닌지를 불리언으로 반환해주고, 인자가 여러개라면 모두 X
인지를 판정한다. class()
는 구체적으로 어떤 자료형인지 문자열로 반환해준다.
한편 as.X()
함수는 주어진 인자를 가능한 한 X
로 변환해준다.
비슷하게 숫자로 적힌 범주형 데이터 역시 as.numeric()
으로 변환하면 끝날 것 같지만, 그 이전에 범주형 데이터를 이해해야한다.
실전 예시
다음의 예시를 보자:
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)