Gae Ko's Blog

[Data Science] dplyr의 group_by, chaining, join 본문

통계/R

[Data Science] dplyr의 group_by, chaining, join

Gae Ko 2018. 2. 20. 03:04

먼저 dplyr의 핵심 동사는 다음과 같다.


  • filter(df, 조건) : 행 선택
  • arrange(df, 변수1, 변수2, ...) : 행 정렬
  • select(df, 변수1, 변수2, ... ) : 변수/열 선택
  • mutate(df, 타겟변수1 = 변환, ... ) : 변수 변환
  • summarize(df, 타겟변수1=통계함수, ... ) : 변수 요약
  • distinct( )
  • sample_n( ) and sample_frac( ) 

  • 각 함수에 대하여 ☞ http://gaeko-security-hack.tistory.com/129?category=722260


    ※ group_by를 이용한 그룹 연산 


    group_by() 명령은 데이터셋을 그룹으로 나눈 후, 그룹별로 위의 연산들을 적용한다. 


      group_by( DF, GROUPING_VARIABLE) 


    ex. 

    - summarize() 는 각 그룹별로 요약통계량을 계산한다.

    - select()는 그룹 변수를 항상 포함

    - sample_n() 과 sample_frac()는 그룹별로 랜덤 샘플링 


    > # 각 대륙별 기대 수명의 중간값구하기 

    > # 그루핑부터 해보면 다음과 같다. 

    > gapminder %>%

    +   filter(year==2007) %>%

    +   group_by(continent)

    # A tibble: 142 x 6

    # Groups:   continent [5]

       country     continent  year lifeExp       pop gdpPercap

       <fct>       <fct>     <int>   <dbl>     <int>     <dbl>

     1 Afghanistan Asia       2007    43.8  31889923       975

     2 Albania     Europe     2007    76.4   3600523      5937

     3 Algeria     Africa     2007    72.3  33333216      6223

     4 Angola      Africa     2007    42.7  12420476      4797

     5 Argentina   Americas   2007    75.3  40301927     12779

     6 Australia   Oceania    2007    81.2  20434176     34435

     7 Austria     Europe     2007    79.8   8199783     36126

     8 Bahrain     Asia       2007    75.6    708573     29796

     9 Bangladesh  Asia       2007    64.1 150448339      1391

    10 Belgium     Europe     2007    79.4  10392226     33693

    # ... with 132 more rows 

    >

    >

    > # 각 대륙별 기대 수명의 중간값구하기 

    > gapminder %>%

    +   filter(year==2007) %>%

    +   group_by(continent) %>%

    +   summarize(median(lifeExp))

    # A tibble: 5 x 2

      continent `median(lifeExp)`

      <fct>                 <dbl>

    1 Africa                 52.9

    2 Americas               72.9

    3 Asia                   72.4

    4 Europe                 78.6

    5 Oceania                80.7



    ※ dplyr 명령의 특징, 체이닝(chaining)


    - 첫 번째 입력은 데이터프레임이다.

    - 두 번째 입력은 주로 열이름으로 이루어진 조건/계산문이다. $ 인덱싱이 필요없음

    - 결과는 데이터프레임 (tbl_df의 속성도 가진)


    dplyr 명령을 사용하면 연쇄적 연산 (체이닝, chaining)이 가능하다.

    연쇄적 연산이 얼마나 가독성이 좋고 코딩이 간편한지는 다음의 두가지 코드를 비교해보라.


    # {base} 패키지를 사용하여 계산하는 경우 


    # 각 대륙별 기대 수명의 중간값을 내림차순으로 정렬 

    d1 = filter(gapminder, year==2007)

    d2 = group_by(d1, continent)

    d3 = summarize(d2, lifeExp = median(lifeExp))

    arrange(d3, -lifeExp)


    # 또는 

    arrange(

      summarize(

        group_by(

          filter(gapminder, year==2007), continent

          ), lifeExp = median(lifeExp)

        ), -lifeExp

      )


    # {dplyr} 패키지를 사용하여 연쇄적 연산을 사용하여 계산하는 경우 


    # 각 대륙별 기대 수명의 중간값을 내림차순으로 정렬 

    gapminder %>%

      filter(year==2007) %>%

      group_by(continent) %>%

      summarize(lifeExp = median(lifeExp)) %>%

      arrange(-lifeExp) 


    연산순서를 왼쪽에서 오른쪽으로, 위에서 아래로 읽을 수 있으므로 가독성이 좋아진다.



    ※ 테이블을 결합하는 조인 연산자 


    조인(join)은 여러 테이블로부터의 변수를 결합한다.


    data_frame()함수를 사용하여 예제데이터를 만들어보자. 

    // dplyr::data_frame()함수는 {base} 패키지의 data.frame()와 동일한 함수. 


    inner_join() x와 y에 모두 매칭되는 행만 포함한다. // 교집합

    - left_join() x 테이블의 모든 행을 포함. 매칭되지 않은 y 테이블 변수들은 NA가 됨.

    - right_join() y 테이블의 모든 행을 포함. 매칭되지 않은 x 테이블 변수들은 NA가 됨.

    - full_join() 모든 행을 포함 // 합집합



    '통계 > R' 카테고리의 다른 글

    [Rstudio] 작업 디렉토리 설정하기  (0) 2018.02.20
    [Data Science] dplyr 핵심 동사  (0) 2018.02.19
    [Data Science] R의 dplyr 패키지  (0) 2018.02.19
    [R] apply() 함수  (0) 2018.02.16
    [R] 정렬하기  (0) 2018.02.16