다른사람들에게 데이터를 받아서 일하게 되는 경우 대부분 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를 참고하시면 좋을 것 같습니다.