728x90

R은 통계프로그래밍 언어로 일반인이 사용하기 쉽게 만든 언어이다.

그러나 필자는 프로그래머이고 비 프로그래머의 인식으로 접근하기 힘든면이 있다.

강의 또한 그러하다. 강의 곳곳에 프로그래머적인 시선이 들어있으니 참고하여 필요없으면 넘겨라.


참고:

[개발환경 셋팅하기]R설치 및 환경변수 등록-(1)

[개발환경 셋팅하기]RStudio설치-(2)

[개발환경 셋팅하기]RStudio프로젝트 만들기-(3)


factor는 vector형과 유사하다. 사실 데이터를 수정하지 않고 사용만 한다면 그냥 둘은 동일하다고 봐도 무방할 정도이다.

하지만 실제로 사용해보면 팩터와 벡터는 어마어마한 차이가 있다.

바로 factor는 레벨을 가진다는 것이다. 레벨이 무슨말인지 모르겠다면 원소의 도메인이 지정되어 있어 그 외의 값을 사용할 수 없다는 것이다.

기본적으로 팩터는 아래와 같이 선언하며 사용한다.


fact<-factor(c(1,2,3,4))

str(fact)

print(fact)


처음 등장했는데 str함수는 해당 변수의 상세 설명을 보여주는 함수이다. 다른 데이터형에도 유용하다.



보면 레벨이라는 것이 존재하는걸 확인할 수 있다.

레벨은 내가 지정해줄 수도 있지만 지정하지 않는다면 맨처음 초기화될때의 값을 기준으로 레벨을 만든다.

따라서 fact변수의 레벨은 4이며 값으로는 1,2,3,4를 가진다.

이 레벨을 벗어나는 데이터를 넣으려고 하면 거부하며 에러를 내뱉는다.


fact<-factor(c(1,2,3,4))

fact[5]<-7


위 코드에서 5번째 변수로 기존의 값인 1,2,3,4가 아닌 7을 넣으면 어떻게될까?



에러를 내뱉으면서 NA를 추가했다. NA는 not available의 줄임말로 공간은 차지하되 값은 없는 상태를 의미한다.

이때까지도 자주 봤었고 앞으로도 자주볼것이다.

즉 NA는 레벨에 상관없이 부착이 가능하다. 따라서 보통 데이터에 더미를 넣을경우 factor에는 NA를 넣는 경우가 흔하다.


위를 해결하기위해서는 두가지 방법이 있다.

한가지는 처음부터 레벨을 지정해서 넣을 수 있게 해주는 것이다.


fact<-factor(c(1,2,3,4),levels = seq(10))

fact[5]<-7


위 같이 levels속성에 1부터 10까지를 넣어주면 나중에 7을 추가할 수 있기 때문에 별 문제없이 사용할 수 있다.

추가적으로 앞으로도 1부터 10까지의 값을 넣어서 사용할 가능성이 생기게된다.


fact<-factor(c(1,2,3,4))

levels(fact)<-append(levels(fact),7)

fact[5]<-7


또다른 방법은 levels함수를 사용해서 추가시켜 주는 것이다.

levels함수를 사용해서 레벨을 알아내서 거기에 값을 추가하고 다시 레벨로 넣는 것이다.

윗 방법과 아랫 방법 모두 쓰는 상황이 다르므로 어느게 낫다고 말하기는 힘들다.

상황에 맞게 사용하자.


vector와 factor의 전환


vector는 일반 데이터고 factor는 범주를 가지는 데이터이다.

경우에 따라서 둘을 스왑해줘야할 일이 있다.

어떤 함수는 factor를 사용하고 어떤 함수는 vector를 사용하는 일이 있기 때문이다.

둘은 사용하는 감각이 비슷하므로 전환도 쉽게 이루어진다.


fact<-factor(c(1,2,3,4))

vect<-as.numeric(fact)


as는 타입캐스팅에 쓰는데 명시적으로 numeric으로 바꿔주면 된다.

만약 팩터형이 문자형이라면 as.character를 사용해야한다.

그러면 기존의 레벨정보는 모두 사라지고 vector가 된다.



벡터를 팩터로 바꾸는건 고민안해도 된다.

위의 전체 예제가 벡터를 팩터로 바꾸는 것이니까.


'Programming > R' 카테고리의 다른 글

[R-21]산포도 그리기  (0) 2017.11.20
[R-20]그래프 출력,화면 분할(plot,screen)  (0) 2017.11.19
[R-18]R데이터 읽기,쓰기(data,Rdata)  (0) 2017.11.19
[R-17]파일 읽기,쓰기(json)  (0) 2017.11.19
[R-16]파일 읽기(xml)  (0) 2017.11.19

+ Recent posts