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()
으로 바꾸더라도 범주라는 점에 입각해 자연수에 일대일 대응이 이루어지게 된다. 생각해보면 같은 범주에도 대응하기 위해선 이러한 방식이 가장 합당하다.
따라서 주어진 수를 그대로 유지하기 위해선 우선 문자열로 변환한 뒤에 수로 변환할 필요가 있다. 수로 이루어진 범주가 문자열로 변환될 땐 딱히 자연수에 대응하지 않고 그대로를 받아오므로 정보의 손실이 없고, 수로 이루어진 문자열이 수로 변환될 땐 딱히 새로운 수를 만들어낼 필요가 없기 때문에 정보의 손실이 없다.
함수들과 자료형을 잘 이해하고 있으면 데이터 핸들링에 있어서 유용한 여러가지 트릭을 사용할 수 있게 된다. 당장 직접적으로 통계랑 상관없다고 경시해선 안될 소중한 무기인 것이다.
코드
아래는 예제 코드다.
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)