R$ 더러운 데이터 청소하기: janitor package
by Youngjun Na
다른사람들에게 데이터를 받아서 일하게 되는 경우 대부분 R에 사용하기에 적합한 형태로 되어 있지 않은 경우가 많습니다. 열의 이름이 숫자로 시작한다거나 띄어쓰기가 되어 있다던가 특수문자가 들어있다던가 셀이 병합되어 있다던가 하는 경우입니다.
이런 dirty data를 clean하게 만들어주는 패키지가 있습니다. 바로 janitor 패키지입니다. janitor는 청소부란 뜻을 가지고 있습니다. 이 패키지와 함께 더러운 파일을 청소해봅시다.
# install.package("janitor")
# OR
# devtools::install_github("sfirke/janitor")
library(janitor)
더러운 데이터 청소하기
패키지 저자가 제공하는 dirty_data.xlsx를 예제로 사용하겠습니다.
견적은 다음과 같습니다.
- 더러운 열이름
- 엑셀 형식이지만 데이터가 없음
- 숫자 형식으로 저장된 날짜
- “Certification”이라는 열이 3개나 있음
한번 읽어들여 보겠습니다.
roster_raw <- readxl::read_excel("dirty_data.xlsx")
str(roster_raw)
## Classes 'tbl_df', 'tbl' and 'data.frame': 13 obs. of 11 variables:
## $ First Name : chr "Jason" "Jason" "Alicia" "Ada" ...
## $ Last Name : chr "Bourne" "Bourne" "Keys" "Lovelace" ...
## $ Employee Status : chr "Teacher" "Teacher" "Teacher" "Teacher" ...
## $ Subject : chr "PE" "Drafting" "Music" NA ...
## $ Hire Date : num 39690 39690 37118 27515 41431 ...
## $ % Allocated : num 0.75 0.25 1 1 1 0.5 0.5 NA 0.5 0.5 ...
## $ Full time? : chr "Yes" "Yes" "Yes" "Yes" ...
## $ do not edit! --->: logi NA NA NA NA NA NA ...
## $ Certification : chr "Physical ed" "Physical ed" "Instr. music" "PENDING" ...
## $ Certification__1 : chr "Theater" "Theater" "Vocal music" "Computers" ...
## $ Certification__2 : logi NA NA NA NA NA NA ...
ㅎ ㅏA…….
일단 clean_names()
를 이용해 이름부터 어떻게 해보겠습니다.
roster <- roster_raw %>% clean_names()
str(roster)
## Classes 'tbl_df', 'tbl' and 'data.frame': 13 obs. of 11 variables:
## $ first_name : chr "Jason" "Jason" "Alicia" "Ada" ...
## $ last_name : chr "Bourne" "Bourne" "Keys" "Lovelace" ...
## $ employee_status : chr "Teacher" "Teacher" "Teacher" "Teacher" ...
## $ subject : chr "PE" "Drafting" "Music" NA ...
## $ hire_date : num 39690 39690 37118 27515 41431 ...
## $ percent_allocated: num 0.75 0.25 1 1 1 0.5 0.5 NA 0.5 0.5 ...
## $ full_time : chr "Yes" "Yes" "Yes" "Yes" ...
## $ do_not_edit : logi NA NA NA NA NA NA ...
## $ certification : chr "Physical ed" "Physical ed" "Instr. music" "PENDING" ...
## $ certification_1 : chr "Theater" "Theater" "Vocal music" "Computers" ...
## $ certification_2 : logi NA NA NA NA NA NA ...
엑셀에서 불러온 요상한(?) 열이름이 R을 사용하기 편한 형태로 수정되었습니다. 그리고 빈행과 빈열을 없애줍니다.
roster <- roster %>% remove_empty(c("rows","cols"))
str(roster)
## Classes 'tbl_df', 'tbl' and 'data.frame': 12 obs. of 9 variables:
## $ first_name : chr "Jason" "Jason" "Alicia" "Ada" ...
## $ last_name : chr "Bourne" "Bourne" "Keys" "Lovelace" ...
## $ employee_status : chr "Teacher" "Teacher" "Teacher" "Teacher" ...
## $ subject : chr "PE" "Drafting" "Music" NA ...
## $ hire_date : num 39690 39690 37118 27515 41431 ...
## $ percent_allocated: num 0.75 0.25 1 1 1 0.5 0.5 0.5 0.5 NA ...
## $ full_time : chr "Yes" "Yes" "Yes" "Yes" ...
## $ certification : chr "Physical ed" "Physical ed" "Instr. music" "PENDING" ...
## $ certification_1 : chr "Theater" "Theater" "Vocal music" "Computers" ...
excel_numeric_to_date()
를 이용하면 엑셀에서 숫자형식으로 저장된 날짜를 바꿀 수 있습니다.
roster$hire_date <- excel_numeric_to_date(roster$hire_date)
roster["hire_date"]
## # A tibble: 12 x 1
## hire_date
## <date>
## 1 2008-08-30
## 2 2008-08-30
## 3 2001-08-15
## 4 1975-05-01
## 5 2013-06-06
## 6 1930-03-20
## 7 1930-03-20
## 8 1990-05-01
## 9 1976-06-08
## 10 2015-08-05
## 11 1995-01-01
## 12 2009-09-15
어째 좀 깨끗해 진 것 같습니다..
Before
print.data.frame(roster_raw)
## First Name Last Name Employee Status Subject Hire Date % Allocated
## 1 Jason Bourne Teacher PE 39690 0.75
## 2 Jason Bourne Teacher Drafting 39690 0.25
## 3 Alicia Keys Teacher Music 37118 1.00
## 4 Ada Lovelace Teacher <NA> 27515 1.00
## 5 Desus Nice Administration Dean 41431 1.00
## 6 Chien-Shiung Wu Teacher Physics 11037 0.50
## 7 Chien-Shiung Wu Teacher Chemistry 11037 0.50
## 8 <NA> <NA> <NA> <NA> NA NA
## 9 James Joyce Teacher English 32994 0.50
## 10 Hedy Lamarr Teacher Science 27919 0.50
## 11 Carlos Boozer Coach Basketball 42221 NA
## 12 Young Boozer Coach <NA> 34700 NA
## 13 Micheal Larsen Teacher English 40071 0.80
## Full time? do not edit! ---> Certification Certification__1
## 1 Yes NA Physical ed Theater
## 2 Yes NA Physical ed Theater
## 3 Yes NA Instr. music Vocal music
## 4 Yes NA PENDING Computers
## 5 Yes NA PENDING <NA>
## 6 Yes NA Science 6-12 Physics
## 7 Yes NA Science 6-12 Physics
## 8 <NA> NA <NA> <NA>
## 9 No NA <NA> English 6-12
## 10 No NA PENDING <NA>
## 11 No NA Physical ed <NA>
## 12 No NA <NA> Political sci.
## 13 No NA Vocal music English
## Certification__2
## 1 NA
## 2 NA
## 3 NA
## 4 NA
## 5 NA
## 6 NA
## 7 NA
## 8 NA
## 9 NA
## 10 NA
## 11 NA
## 12 NA
## 13 NA
After
print.data.frame(roster)
## first_name last_name employee_status subject hire_date
## 1 Jason Bourne Teacher PE 2008-08-30
## 2 Jason Bourne Teacher Drafting 2008-08-30
## 3 Alicia Keys Teacher Music 2001-08-15
## 4 Ada Lovelace Teacher <NA> 1975-05-01
## 5 Desus Nice Administration Dean 2013-06-06
## 6 Chien-Shiung Wu Teacher Physics 1930-03-20
## 7 Chien-Shiung Wu Teacher Chemistry 1930-03-20
## 8 James Joyce Teacher English 1990-05-01
## 9 Hedy Lamarr Teacher Science 1976-06-08
## 10 Carlos Boozer Coach Basketball 2015-08-05
## 11 Young Boozer Coach <NA> 1995-01-01
## 12 Micheal Larsen Teacher English 2009-09-15
## percent_allocated full_time certification certification_1
## 1 0.75 Yes Physical ed Theater
## 2 0.25 Yes Physical ed Theater
## 3 1.00 Yes Instr. music Vocal music
## 4 1.00 Yes PENDING Computers
## 5 1.00 Yes PENDING <NA>
## 6 0.50 Yes Science 6-12 Physics
## 7 0.50 Yes Science 6-12 Physics
## 8 0.50 No <NA> English 6-12
## 9 0.50 No PENDING <NA>
## 10 NA No Physical ed <NA>
## 11 NA No <NA> Political sci.
## 12 0.80 No Vocal music English
중복된 데이터 확인
janitor 패키지에서는 get_dupes()
로 중복되는 데이터를 확인해 볼 수도 있습니다. 예를 들어
roster %>% get_dupes(first_name, last_name)
## # A tibble: 4 x 10
## first_name last_name dupe_count employee_status subject hire_date
## <chr> <chr> <int> <chr> <chr> <date>
## 1 Chien-Shiung Wu 2 Teacher Physics 1930-03-20
## 2 Chien-Shiung Wu 2 Teacher Chemistry 1930-03-20
## 3 Jason Bourne 2 Teacher PE 2008-08-30
## 4 Jason Bourne 2 Teacher Drafting 2008-08-30
## # ... with 4 more variables: percent_allocated <dbl>, full_time <chr>,
## # certification <chr>, certification_1 <chr>
이 선생님들은 두가지 과목을 가르치는 바람에 데이터셋에서 이름이 두번 등장하게 됩니다.
+
janitor 패키지는 tidyverse를 기반으로 만들어졌습니다. 따라서 tidyverse와 연계되어 이용할 수 있는 여러가지 함수를 제공합니다. 더 자세한 내용은 https://github.com/sfirke/janitor 또는 http://sfirke.github.io/janitor/articles/janitor.html를 참고하시면 좋을 것 같습니다.
Subscribe via RSS