본문 바로가기
R/R Language

[tidyverse] tidyr 패키지 사용법 (split, reshape, combine)

by Gom Guard 2018. 6. 13.



tidyr 패키지

  • 패키지는 tidy data 를 만들기 위해 만들어졌습니다. tidy data 란 다음의 조건을 만족하는 데이터 입니다.

    • 하나의 열은 하나의 변수일 것
    • 하나의 행은 하나의 케이스일 것
    • 하나의 값은 하나의 셀일 것
  •  tidy data 는 데이터를 저장하는 표준 방법 이며 tidyverse 패키지 전체에서 사용됩니다. 데이터가 tidy 하다면 데이터를 정제하는 시간을 현저히 줄일 수 있으며 분석 작업에 더 많은 시간을 할애할 수 있습니다.
  • 본 포스트는 rstudio 에서 제공하는 tidyr 패키지 cheetsheet 에 나오는 내용을 바탕으로 구성하였습니다.


설치 및 사용법 

  • 위에서도 설명했던 것 처럼 tidyr 패키지는 tidyverse 패키지의 일부 입니다. 따라서 tidyverse 패키지 전체를 설치하셔도 되고 tidyr 패키지만 따로 설치하셔도 됩니다. 이후에 사용할 때도 tidyverse 패키지를 불러와도 되고 tidyr 패키지만 불러와도 됩니다.



셀 분할하기 - separate 

  • 하나의 셀을 두개로 분할 하기 위해서 사용하는 가장 기본적인 메소드 입니다. separate 내부 파라메터중 자주 사용하는 파라메터는 data, col, into, sep 이며 사용법은 예시를 통해 살펴보겠습니다.

  • separate( data = test_table, col = rate, sep = "/", into = c("cases", "pop") )

  • test_table 의 rate 를 보면 / 를 기준으로 두 가지의 데이터가 결합되어 있는 것을 확인할 수 있습니다. 0.7k/19m 을 / 기준으로 0.7k 와 19m 으로 분할하려면 col 에 rate 를 지정하고 sep 에 "/" 를, into 에 cases 와 pop 를 지정해주면 됩니다.



셀 분할하기 - separate_rows 

  • separate 메소드는 하나의 열을 두개의 열로 분할하는 메소드 입니다. 하지만 하나의 열의 데이터를 분할 한 뒤 하나의 열로 만들고 싶다면 separate_rows 메소드를 사용해야합니다.

  • separate_rows( data = test_table, col = rate, sep = "/" )

  • separate_rows 에 원하는 테이블, 분할하고 싶은 열이름, 구분자 만 지정해주면 두 개의 데이터를 분할해서 하나의 열로 만드는 것이 가능합니다.



셀 결합하기 - unite 

  • 여러 열의 데이터를 하나의 열로 합치기 위해서는 unite 메소드를 사용해야합니다. 예시를 통해 사용법을 살펴보겠습니다.


  • unite( data = test_table, col = "year", century, year, sep = "" )

  • 원하는 테이블을 지정하고 결합 뒤의 새로운 열의 이름을 지정, 결합할 열들을 나열해준 뒤에 구분자를 정해주면 됩니다. 위의 예시의 경우에는 구분자가 없지만 "_" 같은 것으로 지정해 주었을 경우에는 19 + 99 -> 19_99 처럼 결합이 될 것입니다.



데이터 모양 변형하기 - gather 

  • gather 은 모으다 라는 의미를 갖고 있습니다. 그래서인지 gather 메소드는 여러 열을 2 개의 열로 재구성하는 기능을 갖고 있습니다.

  • gather( data = test_table, key = "year", value = "cases", `1999`, `2000` )

  • 1999 년도의 정보와 2000 년도의 정보를 year 기준으로 재구성 한 것을 볼 수 있습니다. 하나의 변수로 묶일 수 있는 것들이 각자의 열이 되어있으면 필터링 하거나 플롯을 그릴 때 한 번의 작업을 더 거쳐야하는 경우들이 생깁니다. 효과적으로 데이터를 분석하기 위해선 하나의 변수로 묶일 수 있는 것은 하나의 열로 구성하는 것이 적합합니다.

  • 원하는 테이블을 지정하고 key 값과 value 값의 열이름을 정한 뒤 합칠 열들을 나열해주면 됩니다. 열들을 나열할 때는 작은 따옴표가 아닌 1 옆에 있는 ` 기호를 사용해야합니다.



데이터 모양 변형하기 - spread 

  • spread 는 펼치다 라는 의미를 갖고 있습니다. 그래서 gather 과 반대로 2 개의 열을 여러개의 열로 펼칠 때 사용합니다.

  • spread( data = test_table, key = "type", value = "count" )

  • 테이블을 지정하고 새로운 열이름이 될 값들이 있는 열을 key 에 지정한 뒤 새로운 열들에 채워질 value 들이 있는 열을 value 에 지정해주면 됩니다.



결측치 다루기 

  • 결측치를 다루는 방법은 여러가지가 있습니다. 

  • 가장 기본적인 방법으로는 결측치가 있는 행을 삭제하는 방법이 있습니다. 이 때 사용하는 메소드는 drop_na() 메소드 인데 테이블 명과 결측치를 검사할 열이름을 parameter 로 사용합니다.

  • 두 번째 방법은 주변 것으로 채우는 방법입니다. fill() 메소드를 사용하고 drop_na() 와 동일하게 테이블 명과 결측치를 검사할 이름을 받습니다. 추가로 받는 parameter 는 아래에 있는 값으로 채울지 위에 있는 값으로 채울지 인데 기본값은 위에 있는 값으로 채우는 것 입니다.

  • 세 번째 방법은 어떤 값으로 채울지 지정해주는 것 입니다. replace_na() 메소드를 사용하며 테이블 명과 list() 를 사용하여 각 열에 어떤 값으로 채울지 지정해줄 수 있습니다.





2018/06/12 - [R/R Language] - [R 기본] readr 패키지 사용법 (read_csv, write_csv)

2018/06/16 - [R/R Language] - [R 기본] stringr 패키지 사용법 (detect, mutate, manage string)

2018/06/20 - [R/R Language] - [R] 꼭 얄아야 할 R 기본 개념 part.1 (help, install.package, getwd, setwd)

2018/06/20 - [R/R Language] - [R] 꼭 얄아야 할 R 기본 개념 part.2 (행렬곱, t, rbind, cbind, seq, rep)








부족한 블로그에 방문해 주셔서 감사합니다.

잘못된 부분이나 질문이 있으시면 

댓글로 말씀해주세요.


금방 확인하고 피드백 드리겠습니다.


좋은 하루 되세요. ^^


댓글11

  • 천창범 2019.03.24 14:00

    쉽게 정리된 유익한 포스팅 잘 읽었습니다.
    감사합니다!
    답글

  • 김은영 2019.09.10 14:54

    안녕하세요, 혹 여기 test _table은 어디서 얻을 수 있을지 알 수 있을까요? 늘 감사합니다.
    답글

    • Gom Guard 2019.09.10 15:40 신고

      안녕하세요. 김은영님.

      일하던 와중 댓글알림을 마침 봤는데, 힘이 되는 댓글달아주셔서 정말 감사합니다. ^^

      예제에 사용한 테이블은 지금은 없습니다만, 엑셀을 통해 csv 를 만들거나, tribble 함수를 통해 R 내에서 직접 만들어 보셔야 할 것 같습니다.

      다음에 글을 쓰게 된다면 예제 테이블도 같이 올려드리겠습니다.

      다시한번 댓글 달아주셔서 감사하며, 좋은 하루 보내세요~ ^^

  • 김은영 2019.09.10 17:15

    아닙니다, ㅜ 그러실 필요는 없습니다. 안그래도 제가 만들어서 쓰고는 있었습니다. 정말 감사드립니다.
    그리고 죄송하지만 마지막 결측치 삭제 부분에서
    Error in UseMethod("drop_na_") :
    no applicable method for 'drop_na_' applied to an object of class "c('matrix', 'character')"

    이런 표시가 뜬다면 혹 왜 그런지 가르쳐 주실수 있으실까요? 물론 가르쳐 주시지 않으셔도 됩니다. 정말 감사합니다@ 좋은 하루 되세요
    답글

    • Gom Guard 2019.09.10 17:18 신고

      drop_na 에 들어갈 형식은 data.frame 이 기본일텐데 아마 matrix 를 넣으셔서 그런 것 같습니다.

      matrix 를 data frame 혹은 tibble 형태로 변경해서 넣어주시면 될 것 같습니다.

      as.data.frame
      as_tibble

  • 김은영 2019.09.10 17:53

    아 정말 너무 감사드립니다...덕분에 좋은 하루 보낼 수 있었고 곰가드님도 꼭 좋은 하루, 내일 되시길 바리겠습니다.
    답글

  • 김은영 2019.09.11 10:58

    안녕하세요, 바쁘실텐데 송구스럽지만 혹 replace_na를 사용하였을때

    > x6 = replace_na(x4,list(x2 = 5))
    Warning message:
    In `[<-.factor`(`*tmp*`, !is_complete(data[[var]]), value = 5) :
    invalid factor level, NA generated

    이러한 메세지가 뜨는것은 왜 그런지 알 수 있을까 여쭈려 댓글을 남기게 되었습니다.

    fill_na나 drop_na는 곰가드님이 적으신것 처럼 다 정상적으로 되는데, replace_na만 저런식으로 나와 여쭙게 되었습니다.

    감사합니다.
    답글

    • Gom Guard 2020.01.06 16:35

      안녕하세요. 김은영님.

      x4 가 뭔지에 대한 정보도 같이 있었다면 더 적확한 답변을 드릴 수 있을 것 같습니다. ^^

  • 2020.06.18 21:42

    비밀댓글입니다
    답글

  • adws1432 2020.08.03 15:47

    덕분에 공부 잘하고 갑니다! 감사합니다ㅎㅎ
    답글