R복습_데이터구조 팩터(생성, 범주값, 인덱스, 슬라이싱, 함수,실습)+벡터 부록!

2024. 9. 27. 14:56R분석

팩터

일종의 벡터로, 범주형 데이터를 다루는데사용하는 데이터 구조이다. 범주형데이터는 성별이나 혈액형처럼 범주로 구분할 수 있는 데이터를 말한다. 팩터는 값의 종류가 한번 정해지면 다른 값을 추가할 수 없으며, 생성할때는 factor()함수를 이용하여 생성한다.

 

 

팩터 생성

#팩터(factor)

bt <- c('a','b','o','ab') #문자형 벡터
print(bt)

bt.new <- factor(bt)
print(bt.new)
print(levels(bt.new)) #범주값확인 함수 : levels
print(class(bt.new)) #factor

 

팩터를 생성할때는 먼저 원하는 범주형 데이터를 벡터로 생성한뒤 factor함수를 이용하여 생성한 벡터를 팩터로 변환하는 방법을 주로 사용한다. 팩터를 생성한 후 출력하면 levels값과 함께 출력되는걸 확인할 수 있는데 여기서 levels값은 팩터가 가진 범주형 데이터를 보여주는것이다. 팩터가 가진 범주형 데이터만 보고싶다면 levels(팩터명)을 적어 확인한다.

 

 

팩터의 요소접근

#팩터의 요소 접근
print(bt)
print(bt.new[4])
print(bt.new[2])
print(bt.new[-1])
print(bt.new[5]) #인덱스범위 벗어나면 결측값 반환
#하지만 levels값은 함께 출력됨

#슬라이싱
print(bt.new[1:3])
print(bt.new[2:4])

팩터의 요소에 접근하는 방법은 다른 데이터구조와 크게 다르지 않다. 팩터명[인덱스번호]를 적어 접근하며, 슬라이싱도 가능하다.

인덱싱이나 슬라이싱을 하여 요소에 접근할때도 levels값들이 함께 출력된다.

 

 

팩터의 숫자형 변환

#팩터의 숫자형 변환
print(bt.new)
print(as.integer(bt.new))
#1, 3, 4, 2
#a  b  c  ab
#팩터에서 알파벳은알파벳의 순서대로 숫자가부여됨
#한글의 경우 팩터의 범주값 숫자는 입력순서대로 1번부터 부여됨

팩터를 숫자형으로 변환할 수 있는데, 이때 알파벳의 경우에는 알파벳 파닉스의 순서를따르게 된다. 그렇기떄문에 가장첫번째로 등장하는 a가 1번, a가 앞글자인 ab가 2번, c가3번, d가 4번으로 형변환 된다. 만악 팩터의 요소값이 한글인 경우에는 입력순서대로 1번부터 부여된다.

 

팩터의 요소 추가

#팩터의 요소 추가
print(length(bt.new)) #현재 팩터 내부요소 4개
bt.new[5] <- 'a'
#아무것도 없는 인덱스 번호 적고 값을 할당.
#5번째 자리에 값을 추가하겠다는 뜻
print(bt.new)

bt.new[6] <- 'c'#에러!
#팩터는 값의 종류가 한번 정해지면 다른 종류의 값들은 추가할 수 없음
#기존에 만들어놓은 bt.new안에 'c'라는 값이 없어서 추가할 수 없음

팩터에 새로운 요소를 추가하는 방법은 다른 데이터구조와 방법이 비슷하지만 큰 차이점이 존재한다. 먼저, 다른 데이터 구조처럼 팩터의 요소에 접근하기위해 팩터명[새로운 인덱스번호]를적고 대입연산자를 활용해서 새로운 값을 넣어준다. 하지만 이때 팩터는 범주값이기때문에 값의 종류가 한번 정해지면 다른 종류의 값들은 추가할 수 없다. 그러므로 팩터에 추가할 수 있는 값은 이미 팩터안에서 정의된 값이여야한다.

 

팩터활용 실습코드

#---------------[실습코드]--------------------#

country <- c("korea","japan","china","korea","India","china","korea")

#1)위의 벡터로 팩터를 만든뒤 출력
f.country <- factor(country)
print(f.country)
print(class(f.country))

#2)팩터의 4번째 값 출력
print(f.country[4])

#3)팩터에 저장된 값의 종류
print(levels(f.country))

#4)팩터의  문자열 값을 숫자형으로 변환한뒤 출력
print(as.integer(f.country))

 

 


벡터 부록

벡터의  특정값 존재 유무확인하기

#벡터에 특정값 존재 유무확인

#벡터생성
vec <- seq(10,50,10)
print(vec)

#방법1) %in%연산자 사용
print(30 %in% vec)
#30이라는 값이 vec안에 있니?하고 묻는것. 결과는 논리형으로 반환
print(100 %in% vec) #거짓
print(12 %in% vec)

#방법2) any(조건식)함수 사용
print(any(vec==30))
print(any(vec>=10)) #관계연산도 사용가능
print(any(vec==1))
print(any(vec==10))

#방법3) which(조건식)함수 사용
#조건식에 부합하는 인덱스 번호를 반환
print(which(vec==30))
print(which(vec>=10))
print(which(vec==5)) #값이 없으면 integer(0)반환

백터의 요소에 특정값이 존재하는지에 대한 유무를 확인하는 방법에는 3가지가있다. 

 

%in%연산자

%in%연산자의 경우 특정값 %in%벡터명의 형태로 사용되며, 이는 앞에적힌 특정값이 해당 벡터요소에 존재하니? 하고묻는 것이기때문에 논리형값인 TRUE,FALSE로 반환된다.

 

 

any(조건식)

 

any(조건식)의 경우에는 any(벡터명 관계연산자 특정값)의 형태로사용되며, 이는 any안에 적힌 조건식에 해당하는 값들이 있는지 확인하는 함수이다. ==이퀄조건 이외에도 일반 관계연산도 사용가능하며, 이역시 any안에 적힌 조건식에 해당하는 값이 있는지 물어보는것이기때문에 논리형으로 값이 반환된다.

 

which(조건식)

any(조건식)과 사용법이 동일하다. 하지만 which의 값은 논리형이 아닌 조건식에 만족하는 해당값의 인덱스번호를 반환한다.

 


학습일기

오늘은 팩터에 대해서 학습했다. 벡터의 일종이다보니 확실히 벡터와 거의 유사한 모습을 띄고있는데, 범주값만 관리하기때문에 새로운 값을 삽입하는데 제한이 있다는점, 그리고 그 범주값들만 또 따로 볼 수 있다는것도 신기했다. 지금은 학습차원에서 팩터안에 있는 범주 요소들이 길지않아서 levels함수를 사용해도 크게 와닿지 않는부분들도 약간 있지만 실무에서는 팩터하나에 관리되는 범주값의 요소들이 수도없이 많기때문에 어떤 요소가 있는지 한번에 확인할 수있는 levels함수가 굉장히 자주사용될것 같다고 생각했다. r이 의료계에서 주로사용된다고 하던데 병명이름이나 다앙한 약품에 대한 데이터를 관리할때 팩터를 사용하면 편리할것같다고 느꼈다.