factor는 R에서 범주형 데이터 구조를 표현하기 위해 사용하는 특별한 데이터 구조형이다. 범주형 데이터란 데이터가 미리 규정된 분류로만 정의되어야 하는 데이터이다. 예를 들어, 사람을 성별로 표현할 때 성별은 남자, 여자로만 정의되어야 한다.(예를 들기 위해 두가지 값으로 표현했다. 필자는 남녀 이외의 성에 대해 편견을 가지지는 않는다..) 이와 같이 사전에 정의되어 있는 변수의 목록을 레벨(level)이라고 한다.
가끔 factor형 변수에 미리 정의되어 있는 level의 값을 변경해야할 때가 있다. 아래의 예와 같이 남, 여를 표현하고 있는 factor형 dt는 중간에 결측치가 존재하여 레벨이 3개(’‘, ’M’, ‘F’)가 존재하게 된다.
df<-data.frame(ID=c(1:10), Gender=factor(c("M","M","M","","F","F","M","","F","F" )),
AgeGroup=factor(c("[60+]", "[26-35]", "[NA]", "[36-45]", "[46-60]", "[26-35]", "[NA]", "[18-25]", "[26-35]", "[26-35]")))
## ID Gender AgeGroup
## 1 1 M [60+]
## 2 2 M [26-35]
## 3 3 M [NA]
## 4 4 [36-45]
## 5 5 F [46-60]
## 6 6 F [26-35]
## 7 7 M [NA]
## 8 8 [18-25]
## 9 9 F [26-35]
## 10 10 F [26-35]
위의 예에서 보듯이 ID 4와 8은 성별 값이 결측치이기 때문에 NULL이 들어가 있다.
만약 이 값을 U(Unknown)으로 바꾸려면 어떻게 해야할까? 다음과 같이 factor의 level 이름을 변경할 수 있다.
levels(df$Gender)[levels(df$Gender)==""] <- "U"
## ID Gender AgeGroup
## 1 1 M [60+]
## 2 2 M [26-35]
## 3 3 M [NA]
## 4 4 U [36-45]
## 5 5 F [46-60]
## 6 6 F [26-35]
## 7 7 M [NA]
## 8 8 U [18-25]
## 9 9 F [26-35]
## 10 10 F [26-35]
한 줄의 코드이지만 그 안에는 3개의 코드가 숨어있다. 코드 설명을 위해 다시 되돌린다.
levels(df$Gender)[levels(df$Gender)=="U"] <- ""
첫 번째 코드는 factor 변수의 level 이름을 NULL("")과 비교한 논리값 벡터를 만든다.
levels(df$Gender)==""
## [1] TRUE FALSE FALSE
두 번째 코드는 논리값 벡터를 사용해 factor에서 변경하고자 하는 level을 선택한다.
levels(df$Gender)[c(TRUE, FALSE, FALSE)]
## [1] ""
위의 코드는 결국 levels(df$Gender)의 첫 번째 요소를 선택하는 것과 같다.
levels(df$Gender)[1]
## [1] ""
이제 선택된 levels(df$Gender)의 첫 번째 요소의 값을 ’’에서 ’U’로 바꾸어 준다.
levels(df$Gender)[c(TRUE, FALSE, FALSE)] <- 'U'
df
## ID Gender AgeGroup
## 1 1 M [60+]
## 2 2 M [26-35]
## 3 3 M [NA]
## 4 4 U [36-45]
## 5 5 F [46-60]
## 6 6 F [26-35]
## 7 7 M [NA]
## 8 8 U [18-25]
## 9 9 F [26-35]
## 10 10 F [26-35]
만약 ’M’을 ’m’으로 바꾸고 싶다면 다음과 같이 할 수도 있겠다.
levels(df$Gender)[c(FALSE, FALSE, TRUE)] <- 'm'
levels(df$Gender)[levels(df$Gender)=="M"] <- 'm'
## ID Gender AgeGroup
## 1 1 m [60+]
## 2 2 m [26-35]
## 3 3 m [NA]
## 4 4 U [36-45]
## 5 5 F [46-60]
## 6 6 F [26-35]
## 7 7 m [NA]
## 8 8 U [18-25]
## 9 9 F [26-35]
## 10 10 F [26-35]
그럼 이번에는 연령대를 바꾸어 본다.
위의 예에서 AgeGroup은 [18-25], [26-35], [36-45], [46-60], [60+], [NA]의 6 가지 level로 구성된 factor이다. 이 level을 [18-35], [35+], [NA]의 3개 레벨로 바꾸는 코드는 다음과 같다 .
levels(df$AgeGroup)[levels(df$AgeGroup)=="[18-25]"] = "[18-35]"
levels(df$AgeGroup)[levels(df$AgeGroup)=="[26-35]"] = "[18-35]"
levels(df$AgeGroup)[levels(df$AgeGroup)=="[36-45]"] = "[35+]"
levels(df$AgeGroup)[levels(df$AgeGroup)=="[46-60]"] = "[35+]"
levels(df$AgeGroup)[levels(df$AgeGroup)=="[60+]"] = "[35+]"
## ID Gender AgeGroup
## 1 1 m [35+]
## 2 2 m [18-35]
## 3 3 m [NA]
## 4 4 U [35+]
## 5 5 F [35+]
## 6 6 F [18-35]
## 7 7 m [NA]
## 8 8 U [18-35]
## 9 9 F [18-35]
## 10 10 F [18-35]
또는 아래와 같이 한 줄의 코드로 실행할 수도 있지만 순서를 잘못 맞추면 원치않는 결과가 나올 수 있어서 주의해야 한다.
levels(df$AgeGroup)<-c("[18-35]","[18-35]","[35+]","[35+]","[35+]", "[NA]")
'데이터 전처리' 카테고리의 다른 글
엑셀처럼 사용하는 R : DataEditR - 1 (0) | 2021.05.27 |
---|---|
열 순서 변경 in R (0) | 2021.05.11 |
PDF 한글 깨짐 처리 in R (0) | 2021.05.04 |
p값 추출과 p값 표현법 in R (0) | 2021.04.07 |
본인만의 R-Studio 테마 만들기 (0) | 2021.04.03 |
댓글