본문 바로가기
통계프로그램 비교 시리즈/데이터 전처리 비교

[데이터 관리] 10. Joining & Merging 데이터 프레임

by 기서무나구물 2022. 1. 14.

포스팅 목차

    [데이터 관리] 10. Joining & Merging 데이터 프레임

     


    1. Proc SQL

    • 중복 시 SAS의 MERGE와 차이 발생
    SAS Programming
    proc sql;
      create table myleft as
        select id,workshop,gender,q1,q2
        from   BACK.mydata;
    
      create table myright as
        select id,workshop,q3,q4
        from   BACK.mydata;
    
      create table myshort(where=(NUM<=4)) as
        select id,workshop,q3,q4,monotonic() as NUM
        from   BACK.mydata;
    
    quit;

     

    Results
    proc sql;
      create table both as
        select coalesce(a.id,b.id) as id,
               coalesce(a.workshop,b.workshop) as workshop,
               a.q1,a.q2,b.q3,b.q4
        from   myleft a , myright b
        where  a.id = b.id
        and    a.workshop = b.workshop;
    
      select * from both;
    quit;

     

     

    SAS Programming
    id  workshop        q1        q2        q3        q4
    ----------------------------------------------------
     1         1         1         1         5         1
     2         2         2         1         4         1
     3         1         2         2         4         3
     4         2         3         1         .         3
     5         1         4         5         2         4
     6         2         5         4         5         5
     7         1         5         3         4         4
     8         2         4         5         5         5

     

    INNER JOIN

    SAS Programming
    proc sql;
      create table both as
        select coalesce(a.id,b.id) as id,
               coalesce(a.workshop,b.workshop) as workshop,
               a.q1,a.q2,b.q3,b.q4
        from   myleft a , myshort(drop=num) b
        where  a.id = b.id
        and    a.workshop = b.workshop;
    
      select * from both;
    
    quit;

     

    Results
    id  workshop        q1        q2        q3        q4
    ----------------------------------------------------
     1         1         1         1         5         1
     2         2         2         1         4         1
     3         1         2         2         4         3
     4         2         3         1         .         3

     

    LEFT JOIN

    SAS Programming
    proc sql;
      create table both as
        select coalesce(a.id,b.id) as id,
               coalesce(a.workshop,b.workshop) as workshop,
               a.q1,a.q2,b.q3,b.q4
        from   myleft a left join myshort(drop=num) b
               on  a.id = b.id
               and a.workshop = b.workshop;
    
      select * from both;
    
    quit;

     

    Results
    id  workshop        q1        q2        q3        q4
    ----------------------------------------------------
     1         1         1         1         5         1
     2         2         2         1         4         1
     3         1         2         2         4         3
     4         2         3         1         .         3
     5         1         4         5         .         .
     6         2         5         4         .         .
     7         1         5         3         .         .
     8         2         4         5         .         .

     

    RIGHT JOIN

    SAS Programming
    proc sql;
      create table both as
        select coalesce(a.id,b.id) as id,
               coalesce(a.workshop,b.workshop) as workshop,
               a.q1,a.q2,b.q3,b.q4
        from   myleft a right join myshort(drop=num) b
               on  a.id = b.id
               and a.workshop = b.workshop;
    
      select * from both;
    
    quit;

     

    Results
    id  workshop        q1        q2        q3        q4
    ----------------------------------------------------
     1         1         1         1         5         1
     2         2         2         1         4         1
     3         1         2         2         4         3
     4         2         3         1         .         3

     

     


    2. SAS Programming

    • 테스트 데이터 생성;
    SAS Programming
    DATA myleft(KEEP=id workshop gender q1 q2)
         myright(KEEP=id workshop q3 q4)
         myshort(KEEP=id workshop q3 q4);
    
     SET BACK.mydata;
         output myleft;
         output myright;
         if _n_ <=4 then output myshort;
    
    run;

     

    SAS Programming
    PROC SORT data=myleft;
         BY id workshop;
    RUN;

     

    Results
    id    workshop    gender    q1    q2
     1        1         f        1     1
     2        2         f        2     1
     3        1         f        2     2
     4        2         f        3     1
     5        1         m        4     5
     6        2         m        5     4
     7        1         m        5     3
     8        2         m        4     5

     

     

    SAS Programming
    PROC SORT data=myright;
         BY id workshop;
    RUN;

     

    Results
    id    workshop    q3    q4
     1        1        5     1
     2        2        4     1
     3        1        4     3
     4        2        .     3
     5        1        2     4
     6        2        5     5
     7        1        4     4
     8        2        5     5

     

     

    SAS Programming
    PROC SORT data=myshort;
         BY id workshop;
    RUN;

     

    Results
    id    workshop    q3    q4
     1        1        5     1
     2        2        4     1
     3        1        4     3
     4        2        .     3

     

     

    • 정렬된 데이터 세트를 가로 결합;
    SAS Programming
    DATA both;
     MERGE myleft myright;
         BY id workshop;
    RUN;

     

    Results
    id    workshop    gender    q1    q2    q3    q4
     1        1         f        1     1     5     1
     2        2         f        2     1     4     1
     3        1         f        2     2     4     3
     4        2         f        3     1     .     3
     5        1         m        4     5     2     4
     6        2         m        5     4     5     5
     7        1         m        5     3     4     4
     8        2         m        4     5     5     5

     

     

    • 각 결합에 대한 예제;
    • Inner join, Left Join, Right Join;
    SAS Programming
    data innerjoin leftjoin rightjoin join_a join_b;
     merge myleft(in=a) myshort(in=b);
    
         by id workshop;
    
         if a and b then output innerjoin;
         if a then output leftjoin;
         if b then output rightjoin;
         if a and b =0  then output join_a;
         if a = 0 and b then output join_b;
    
    run;

     

    Results
    * INNER JOIN;
    
    id    workshop    gender    q1    q2    q3    q4
     1        1         f        1     1     5     1
     2        2         f        2     1     4     1
     3        1         f        2     2     4     3
     4        2         f        3     1     .     3
    
    * LEFT JOIN;
    
    id    workshop    gender    q1    q2    q3    q4
     1        1         f        1     1     5     1
     2        2         f        2     1     4     1
     3        1         f        2     2     4     3
     4        2         f        3     1     .     3
     5        1         m        4     5     .     .
     6        2         m        5     4     .     .
     7        1         m        5     3     .     .
     8        2         m        4     5     .     .
    
    * RIGTH JOIN;
    
    id    workshop    gender    q1    q2    q3    q4
     1        1         f        1     1     5     1
     2        2         f        2     1     4     1
     3        1         f        2     2     4     3
     4        2         f        3     1     .     3
    
    * JOIN_A;
    
    id    workshop    gender    q1    q2    q3    q4
     5        1         m        4     5     .     .
     6        2         m        5     4     .     .
     7        1         m        5     3     .     .
     8        2         m        4     5     .     .
    
    * JOIN_B

     

     


    3. SPSS

     

    SPSS Programming
    
    GET FILE='C:\mydata.sav'.
    DELETE VARIABLES q3 to q4.
    SAVE OUTFILE='C:\myleft.sav'.
    EXECUTE .
    
    
    GET FILE='C:\mydata.sav'.
    DELETE VARIABLES workshop to q2.
    SAVE OUTFILE='C:\myright.sav'.
    EXECUTE .
    
    
    GET FILE='C:\myleft.sav'.
    MATCH FILES /FILE=*
     /FILE='C:\myright.sav'
     /BY id.
    EXECUTE.

     

     


    4. R Programming (R-PROJECT)

     

    R Programming
    from rpy2.robjects import r
    %load_ext rpy2.ipython

     

    Results
    The rpy2.ipython extension is already loaded. To reload it, use:
      %reload_ext rpy2.ipython

     

     

    R Programming
    %%R
    
    library(tidyverse)
    library(psych)
    mydata <- read_csv("C:/work/data/mydata.csv", 
      col_types = cols( id       = col_double(),
                        workshop = col_character(),
                        gender   = col_character(),
                        q1       = col_double(),
                        q2       = col_double(),
                        q3       = col_double(),
                        q4       = col_double()
      )
    )
    
    withmooc = mydata
    
    attach(withmooc) # mydata를 기본 데이터 세트로 지정.
    
    withmooc

     

    Results
    R[write to console]: -- Attaching packages --------------------------------------- tidyverse 1.3.0 --
    
    
    ---------------------------------------
    
        s = ffi.string(c, maxlen).decode('utf-8')
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb4 in position 1: invalid start byte
    R[write to console]: The following objects are masked from 'package:ggplot2':
    
        %+%, alpha

     

    Results
    # A tibble: 8 x 7
         id workshop gender    q1    q2    q3    q4
                
    1     1 1        f          1     1     5     1
    2     2 2        f          2     1     4     1
    3     3 1        f          2     2     4     3
    4     4 2        f          3     1    NA     3
    5     5 1        m          4     5     2     4
    6     6 2        m          5     4     5     5
    7     7 1        m          5     3     4     4
    8     8 2        m          4     5     5     5

     


    • 두 개의 q변수를 포함한 데이터 프레임 생성.
    R Programming
    %%R
    
    myleft<-mydata[ c("id","workshop","gender","q1","q2") ]
    
    myleft

     

    Results
    # A tibble: 8 x 5
         id workshop gender    q1    q2
      <dbl> <chr>    <chr>  <dbl> <dbl>
    1     1 1        f          1     1
    2     2 2        f          2     1
    3     3 1        f          2     2
    4     4 2        f          3     1
    5     5 1        m          4     5
    6     6 2        m          5     4
    7     7 1        m          5     3
    8     8 2        m          4     5

     


    • 두 개의 q변수를 포함한 데이터 프레임 생성.
    R Programming
    %%R
    
    myright<-mydata[ c("id","workshop","q3","q4") ]
    
    myright

     

    Results
    # A tibble: 8 x 4
         id workshop    q3    q4
      <dbl> <chr>    <dbl> <dbl>
    1     1 1            5     1
    2     2 2            4     1
    3     3 1            4     3
    4     4 2           NA     3
    5     5 1            2     4
    6     6 2            5     5
    7     7 1            4     4
    8     8 2            5     5

     


    • ID 변수를 기준 변수로 하여 두 개의 데이터 프레임을 가로 결합(Merge) 한다.
    • “workshop” 변수는 양쪽 데이터 프레임에 존재하기 때문에, 데이터 프레임 Merge에는 이용되지 않고, R-Project는 workshop.x와 workshop.y의 변수명으로 저장한다.
    R Programming
    %%R
    
    both<-merge(myleft,myright,by="id")
    
    both

     

    Results
      id workshop.x gender q1 q2 workshop.y q3 q4
    1  1          1      f  1  1          1  5  1
    2  2          2      f  2  1          2  4  1
    3  3          1      f  2  2          1  4  3
    4  4          2      f  3  1          2 NA  3
    5  5          1      m  4  5          1  2  4
    6  6          2      m  5  4          2  5  5
    7  7          1      m  5  3          1  4  4
    8  8          2      m  4  5          2  5  5

     


    • ID와 Workshop변수를 기준으로 데이터 프레임을 Merge.
    • 원래의 데이터프레임과 동일하게 재생성한다.
    R Programming
    %%R
    
    both<-merge(myleft,myright,by=c("id","workshop"))
    
    both

     

    Results
      id workshop gender q1 q2 q3 q4
    1  1        1      f  1  1  5  1
    2  2        2      f  2  1  4  1
    3  3        1      f  2  2  4  3
    4  4        2      f  3  1 NA  3
    5  5        1      m  4  5  2  4
    6  6        2      m  5  4  5  5
    7  7        1      m  5  3  4  4
    8  8        2      m  4  5  5  5

     


    • ID와 Workshop변수를 기준으로 데이터 프레임을 Merge.
    • 각 데이터프레임에서 기준 변수명이 다른 경우 사용하는 방법이다.
    • 여기서는 두 개 데이터 프레임의 기준 변수명이 다르다고 가정하자.
    R Programming
    %%R
    
    both<-merge(myleft,myright,by.x=c("id","workshop"),
                               by.y=c("id","workshop"))
    
    print(both)

     

    Results
      id workshop gender q1 q2 q3 q4
    1  1        1      f  1  1  5  1
    2  2        2      f  2  1  4  1
    3  3        1      f  2  2  4  3
    4  4        2      f  3  1 NA  3
    5  5        1      m  4  5  2  4
    6  6        2      m  5  4  5  5
    7  7        1      m  5  3  4  4
    8  8        2      m  4  5  5  5

     

     

    R Programming
    %%R
    
    myshort<-myright[1:4,]
    
    print(myshort)

     

    Results
    # A tibble: 4 x 4
         id workshop    q3    q4
      <dbl> <chr>    <dbl> <dbl>
    1     1 1            5     1
    2     2 2            4     1
    3     3 1            4     3
    4     4 2           NA     3

     

     

    • [INNER JOIN]
    R Programming
    %%R
    
    merge(myleft,myshort,by.x=c("id","workshop"),
                         by.y=c("id","workshop"),all=F)

     

    Results
      id workshop gender q1 q2 q3 q4
    1  1        1      f  1  1  5  1
    2  2        2      f  2  1  4  1
    3  3        1      f  2  2  4  3
    4  4        2      f  3  1 NA  3

     


    • [LEFT JOIN]
    R Programming
    %%R
    
    merge(myleft,myshort,by.x=c("id","workshop"),
                         by.y=c("id","workshop"),all.x=T)

     

    Results
      id workshop gender q1 q2 q3 q4
    1  1        1      f  1  1  5  1
    2  2        2      f  2  1  4  1
    3  3        1      f  2  2  4  3
    4  4        2      f  3  1 NA  3
    5  5        1      m  4  5 NA NA
    6  6        2      m  5  4 NA NA
    7  7        1      m  5  3 NA NA
    8  8        2      m  4  5 NA NA

     


    • [RIGHT JOIN]
    R Programming
    %%R
    
    merge(myleft,myshort,by.x=c("id","workshop"),
                         by.y=c("id","workshop"),all.y=T)

     

    Results
      id workshop gender q1 q2 q3 q4
    1  1        1      f  1  1  5  1
    2  2        2      f  2  1  4  1
    3  3        1      f  2  2  4  3
    4  4        2      f  3  1 NA  3

     


    • [OUTER JOIN]
    R Programming
    %%R
    
    merge(myleft,myshort,by.x=c("id","workshop"),
                         by.y=c("id","workshop"),all=T)

     

    Results
      id workshop gender q1 q2 q3 q4
    1  1        1      f  1  1  5  1
    2  2        2      f  2  1  4  1
    3  3        1      f  2  2  4  3
    4  4        2      f  3  1 NA  3
    5  5        1      m  4  5 NA NA
    6  6        2      m  5  4 NA NA
    7  7        1      m  5  3 NA NA
    8  8        2      m  4  5 NA NA

     

     


    5. R - Tidyverse

     

    R Programming
    from rpy2.robjects import r
    %load_ext rpy2.ipython

     

    Results
    The rpy2.ipython extension is already loaded. To reload it, use:
      %reload_ext rpy2.ipython

     

    R Programming
    %%R
    
    library(tidyverse)
    library(psych)
    mydata <- read_csv("C:/work/data/mydata.csv", 
      col_types = cols( id       = col_double(),
                        workshop = col_character(),
                        gender   = col_character(),
                        q1       = col_double(),
                        q2       = col_double(),
                        q3       = col_double(),
                        q4       = col_double()
      )
    )
    
    withmooc = mydata
    
    attach(withmooc) # mydata를 기본 데이터 세트로 지정.
    
    withmooc

     

    Results
    R[write to console]: The following objects are masked from withmooc (pos = 3):
    
        gender, id, q1, q2, q3, q4, workshop
    
    
    
    
    # A tibble: 8 x 7
         id workshop gender    q1    q2    q3    q4
      <dbl> <chr>    <chr>  <dbl> <dbl> <dbl> <dbl>
    1     1 1        f          1     1     5     1
    2     2 2        f          2     1     4     1
    3     3 1        f          2     2     4     3
    4     4 2        f          3     1    NA     3
    5     5 1        m          4     5     2     4
    6     6 2        m          5     4     5     5
    7     7 1        m          5     3     4     4
    8     8 2        m          4     5     5     5

     


    • 두 개의 q변수를 포함한 데이터 프레임 생성.
    R Programming
    %%R
    
    myleft <- mydata %>%
      select("id","workshop","gender","q1","q2")
    
    myleft

     

    Results
    # A tibble: 8 x 5
         id workshop gender    q1    q2
      <dbl> <chr>    <chr>  <dbl> <dbl>
    1     1 1        f          1     1
    2     2 2        f          2     1
    3     3 1        f          2     2
    4     4 2        f          3     1
    5     5 1        m          4     5
    6     6 2        m          5     4
    7     7 1        m          5     3
    8     8 2        m          4     5

     


    • 두 개의 q변수를 포함한 데이터 프레임 생성.
    R Programming
    %%R
    
    myright <- mydata %>%
      select("id","workshop","q3","q4")
    
    myright

     

    Results
    # A tibble: 8 x 4
         id workshop    q3    q4
      <dbl> <chr>    <dbl> <dbl>
    1     1 1            5     1
    2     2 2            4     1
    3     3 1            4     3
    4     4 2           NA     3
    5     5 1            2     4
    6     6 2            5     5
    7     7 1            4     4
    8     8 2            5     5

     

     

    • ID 변수를 기준 변수로 하여 두 개의 데이터 프레임을 가로 결합(Merge) 한다.
    • “workshop” 변수는 양쪽 데이터 프레임에 존재하기 때문에, 데이터 프레임 Merge에는 이용되지 않고, R-Project는 workshop.x와 workshop.y의 변수명으로 저장한다.
    • bind_cols 사용
    R Programming
    %%R
    
    myleft %>%
      bind_cols(myright)

     

    Results
    R[write to console]: New names:
    * id -> id...1
    * workshop -> workshop...2
    * id -> id...6
    * workshop -> workshop...7
    
    
    
    # A tibble: 8 x 9
      id...1 workshop...2 gender    q1    q2 id...6 workshop...7    q3    q4
       <dbl> <chr>        <chr>  <dbl> <dbl>  <dbl> <chr>        <dbl> <dbl>
    1      1 1            f          1     1      1 1                5     1
    2      2 2            f          2     1      2 2                4     1
    3      3 1            f          2     2      3 1                4     3
    4      4 2            f          3     1      4 2               NA     3
    5      5 1            m          4     5      5 1                2     4
    6      6 2            m          5     4      6 2                5     5
    7      7 1            m          5     3      7 1                4     4
    8      8 2            m          4     5      8 2                5     5

     

     

    R Programming
    %%R
    
    bind_cols(myleft,myright)

     

    Results
    R[write to console]: New names:
    * id -> id...1
    * workshop -> workshop...2
    * id -> id...6
    * workshop -> workshop...7
    
    
    
    # A tibble: 8 x 9
      id...1 workshop...2 gender    q1    q2 id...6 workshop...7    q3    q4
       <dbl> <chr>        <chr>  <dbl> <dbl>  <dbl> <chr>        <dbl> <dbl>
    1      1 1            f          1     1      1 1                5     1
    2      2 2            f          2     1      2 2                4     1
    3      3 1            f          2     2      3 1                4     3
    4      4 2            f          3     1      4 2               NA     3
    5      5 1            m          4     5      5 1                2     4
    6      6 2            m          5     4      6 2                5     5
    7      7 1            m          5     3      7 1                4     4
    8      8 2            m          4     5      8 2                5     5

     


    • inner_join 사용
    R Programming
    %%R
    
    both  <- myleft %>%
      inner_join(myright, by = "id")
    
    both

     

    Results
    # A tibble: 8 x 8
         id workshop.x gender    q1    q2 workshop.y    q3    q4
      <dbl> <chr>      <chr>  <dbl> <dbl> <chr>      <dbl> <dbl>
    1     1 1          f          1     1 1              5     1
    2     2 2          f          2     1 2              4     1
    3     3 1          f          2     2 1              4     3
    4     4 2          f          3     1 2             NA     3
    5     5 1          m          4     5 1              2     4
    6     6 2          m          5     4 2              5     5
    7     7 1          m          5     3 1              4     4
    8     8 2          m          4     5 2              5     5

     


    • ID와 Workshop변수를 기준으로 데이터 프레임을 Merge.
    • 원 데이터프레임으로 완벽하게 재생성한다.
    R Programming
    %%R
    
    both  <- myleft %>%
      inner_join(myright, by = c("id","workshop"))
    
    both

     

    Results
    # A tibble: 8 x 7
         id workshop gender    q1    q2    q3    q4
      <dbl> <chr>    <chr>  <dbl> <dbl> <dbl> <dbl>
    1     1 1        f          1     1     5     1
    2     2 2        f          2     1     4     1
    3     3 1        f          2     2     4     3
    4     4 2        f          3     1    NA     3
    5     5 1        m          4     5     2     4
    6     6 2        m          5     4     5     5
    7     7 1        m          5     3     4     4
    8     8 2        m          4     5     5     5

     

     

    • ID와 Workshop변수를 기준으로 데이터 프레임을 Merge.
    • 각 데이터프레임에서 기준 변수명이 다른 경우 사용하는 방법이다.
    • 여기서는 두 개 데이터 프레임의 기준 변수명이 다르다고 가정하자.
    R Programming
    %%R
    
    both  <- myleft %>%
      inner_join(myright, by = c("id","workshop"))
    both

     

    Results
    # A tibble: 8 x 7
         id workshop gender    q1    q2    q3    q4
      <dbl> <chr>    <chr>  <dbl> <dbl> <dbl> <dbl>
    1     1 1        f          1     1     5     1
    2     2 2        f          2     1     4     1
    3     3 1        f          2     2     4     3
    4     4 2        f          3     1    NA     3
    5     5 1        m          4     5     2     4
    6     6 2        m          5     4     5     5
    7     7 1        m          5     3     4     4
    8     8 2        m          4     5     5     5

     

     

    R Programming
    %%R
    
    both  <- myleft %>%
      inner_join(myright, by.x=c("id","workshop"),
                          by.y=c("id","workshop"))
    both

     

    Results
    Joining, by = c("id", "workshop")
    # A tibble: 8 x 7
         id workshop gender    q1    q2    q3    q4
      <dbl> <chr>    <chr>  <dbl> <dbl> <dbl> <dbl>
    1     1 1        f          1     1     5     1
    2     2 2        f          2     1     4     1
    3     3 1        f          2     2     4     3
    4     4 2        f          3     1    NA     3
    5     5 1        m          4     5     2     4
    6     6 2        m          5     4     5     5
    7     7 1        m          5     3     4     4
    8     8 2        m          4     5     5     5

     


    • 실습 데이터 생성
    R Programming
    %%R
    
    myshort <- myright %>%
      slice(1:4)
    
    myshort

     

    Results
    # A tibble: 4 x 4
         id workshop    q3    q4
      <dbl> <chr>    <dbl> <dbl>
    1     1 1            5     1
    2     2 2            4     1
    3     3 1            4     3
    4     4 2           NA     3

     


    • [INNER JOIN]
    R Programming
    %%R
    
    myleft %>%
      inner_join(myshort, by.x=c("id","workshop"),
                          by.y=c("id","workshop"))

     

    Results
    Joining, by = c("id", "workshop")
    # A tibble: 4 x 7
         id workshop gender    q1    q2    q3    q4
      <dbl> <chr>    <chr>  <dbl> <dbl> <dbl> <dbl>
    1     1 1        f          1     1     5     1
    2     2 2        f          2     1     4     1
    3     3 1        f          2     2     4     3
    4     4 2        f          3     1    NA     3

     


    • [LEFT JOIN]
    R Programming
    %%R
    
    myleft %>%
      left_join(myshort, by.x=c("id","workshop"),
                         by.y=c("id","workshop"))

     

    Results
    Joining, by = c("id", "workshop")
    # A tibble: 8 x 7
         id workshop gender    q1    q2    q3    q4
      <dbl> <chr>    <chr>  <dbl> <dbl> <dbl> <dbl>
    1     1 1        f          1     1     5     1
    2     2 2        f          2     1     4     1
    3     3 1        f          2     2     4     3
    4     4 2        f          3     1    NA     3
    5     5 1        m          4     5    NA    NA
    6     6 2        m          5     4    NA    NA
    7     7 1        m          5     3    NA    NA
    8     8 2        m          4     5    NA    NA

     


    • [RIGHT JOIN]
    R Programming
    %%R
    
    myleft %>%
      right_join(myshort, by.x=c("id","workshop"),
                by.y=c("id","workshop"))

     

    Results
    Joining, by = c("id", "workshop")
    # A tibble: 4 x 7
         id workshop gender    q1    q2    q3    q4
      <dbl> <chr>    <chr>  <dbl> <dbl> <dbl> <dbl>
    1     1 1        f          1     1     5     1
    2     2 2        f          2     1     4     1
    3     3 1        f          2     2     4     3
    4     4 2        f          3     1    NA     3

     


    • [OUTER JOIN]
    R Programming
    %%R
    
    myleft %>%
      full_join(myshort, by.x=c("id","workshop"),
                         by.y=c("id","workshop"))

     

    Results
    Joining, by = c("id", "workshop")
    # A tibble: 8 x 7
         id workshop gender    q1    q2    q3    q4
      <dbl> <chr>    <chr>  <dbl> <dbl> <dbl> <dbl>
    1     1 1        f          1     1     5     1
    2     2 2        f          2     1     4     1
    3     3 1        f          2     2     4     3
    4     4 2        f          3     1    NA     3
    5     5 1        m          4     5    NA    NA
    6     6 2        m          5     4    NA    NA
    7     7 1        m          5     3    NA    NA
    8     8 2        m          4     5    NA    NA

     

     


    6. Python - Pandas

     

    Python Programming
    import pandas as pd
    import numpy as np
    import sweetviz as sv
    
    mydata = pd.read_csv("C:/work/data/mydata.csv",sep=",",
                         dtype={'id':object,'workshop':object,
                                'q1':int, 'q2':int, 'q3':float, 'q4':int},
                         na_values=['NaN'],skipinitialspace =True)
    
    withmooc= mydata.copy()
    
    withmooc

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1	1	5.0	1
    1	2	2		f	2	1	4.0	1
    2	3	1		f	2	2	4.0	3
    3	4	2		f	3	1	NaN	3
    4	5	1		m	4	5	2.0	4
    5	6	2		m	5	4	5.0	5
    6	7	1		m	5	3	4.0	4
    7	8	2		m	4	5	5.0	5

     


    • 두 개의 q변수를 포함한 데이터 프레임 생성.
    Python Programming
    myleft = withmooc[["id","workshop","gender","q1","q2"]]
    myleft

     

    Results
    	id	workshop	gender	q1	q2
    0	1	1		f	1	1
    1	2	2		f	2	1
    2	3	1		f	2	2
    3	4	2		f	3	1
    4	5	1		m	4	5
    5	6	2		m	5	4
    6	7	1		m	5	3
    7	8	2		m	4	5

     


    • 두 개의 q변수를 포함한 데이터 프레임 생성.
    Python Programming
    myright = withmooc[["id","workshop","q3","q4"]]
    myright

     

    Results
    	id	workshop	q3	q4
    0	1	1		5.0	1
    1	2	2		4.0	1
    2	3	1		4.0	3
    3	4	2		NaN	3
    4	5	1		2.0	4
    5	6	2		5.0	5
    6	7	1		4.0	4
    7	8	2		5.0	5

     

     


    • ID 변수를 기준 변수로 하여 두 개의 데이터 프레임을 가로 결합(Merge) 한다.
    • “workshop” 변수는 양쪽 데이터 프레임에 존재하기 때문에, 데이터 프레임 Merge에는 이용되지 않고,
    • R-Project는 workshop.x와 workshop.y의 변수명으로 저장한다.
    Python Programming
    pd.merge(myleft, myright, how='inner', on=['id'])

     

    Results
    	id	workshop_x	gender	q1	q2	workshop_y	q3	q4
    0	1	1		f	1	1	1		5.0	1
    1	2	2		f	2	1	2		4.0	1
    2	3	1		f	2	2	1		4.0	3
    3	4	2		f	3	1	2		NaN	3
    4	5	1		m	4	5	1		2.0	4
    5	6	2		m	5	4	2		5.0	5
    6	7	1		m	5	3	1		4.0	4
    7	8	2		m	4	5	2		5.0	5

     

     


    • ID와 Workshop변수를 기준으로 데이터 프레임을 Merge.
    • 원 데이터프레임으로 완벽하게 재생성한다.
    Python Programming
    pd.merge(myleft, myright, how='inner', on=['id','workshop'])

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1	1	5.0	1
    1	2	2		f	2	1	4.0	1
    2	3	1		f	2	2	4.0	3
    3	4	2		f	3	1	NaN	3
    4	5	1		m	4	5	2.0	4
    5	6	2		m	5	4	5.0	5
    6	7	1		m	5	3	4.0	4
    7	8	2		m	4	5	5.0	5

     

     


    • ID와 Workshop변수를 기준으로 데이터 프레임을 Merge.
    • 각 데이터프레임에서 기준 변수명이 다른 경우 사용하는 방법이다.
    • 여기서는 두 개 데이터 프레임의 기준 변수명이 다르다고 가정하자.
    Python Programming
    # 실습 데이터 생성
    
    myright1 = myright.rename(index=str, columns={"id": "id1","workshop": "workshop1","q3": "x3","q4": "x4"})
    myright1

     

    Results
    	id1	workshop1	x3	x4
    0	1	1		5.0	1
    1	2	2		4.0	1
    2	3	1		4.0	3
    3	4	2		NaN	3
    4	5	1		2.0	4
    5	6	2		5.0	5
    6	7	1		4.0	4
    7	8	2		5.0	5

     


    • 결합되는 두 테이블의 키가 되는 변수의 이름이 다르다면 left_on, right_on 인수를 사용하여 기준 열을 지정.
    Python Programming
    pd.merge(myleft, myright1, how='inner', left_on=['id','workshop'], right_on=['id1','workshop1'])

     

    Results
    	id	workshop	gender	q1	q2	id1	workshop1	x3	x4
    0	1	1		f	1	1	1	1		5.0	1
    1	2	2		f	2	1	2	2		4.0	1
    2	3	1		f	2	2	3	1		4.0	3
    3	4	2		f	3	1	4	2		NaN	3
    4	5	1		m	4	5	5	1		2.0	4
    5	6	2		m	5	4	6	2		5.0	5
    6	7	1		m	5	3	7	1		4.0	4
    7	8	2		m	4	5	8	2		5.0	5

     

     

     
    • [INNER JOIN]
    Python Programming
    # 실습데이터me
    myshort = myright.iloc[:4,]
    
    myshort

     

    Results
    	id	workshop	q3	q4
    0	1	1		5.0	1
    1	2	2		4.0	1
    2	3	1		4.0	3
    3	4	2		NaN	3

     

     

    Python Programming
     
    pd.merge(myleft, myshort, how='inner', left_on=['id','workshop'], right_on=['id','workshop'])

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1	1	5.0	1
    1	2	2		f	2	1	4.0	1
    2	3	1		f	2	2	4.0	3
    3	4	2		f	3	1	NaN	3

     

     

     
    • [LEFT JOIN]
    Python Programming
    pd.merge(myleft, myshort, how='left', left_on=['id','workshop'], right_on=['id','workshop'])

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1	1	5.0	1.0
    1	2	2		f	2	1	4.0	1.0
    2	3	1		f	2	2	4.0	3.0
    3	4	2		f	3	1	NaN	3.0
    4	5	1		m	4	5	NaN	NaN
    5	6	2		m	5	4	NaN	NaN
    6	7	1		m	5	3	NaN	NaN
    7	8	2		m	4	5	NaN	NaN

     

     

     
    • [RIGHT JOIN]
    Python Programming
    pd.merge(myleft, myshort, how='right', left_on=['id','workshop'], right_on=['id','workshop'])

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1	1	5.0	1
    1	2	2		f	2	1	4.0	1
    2	3	1		f	2	2	4.0	3
    3	4	2		f	3	1	NaN	3

     

     


    • [OUTER JOIN]
    Python Programming
    pd.merge(myleft, myshort, how='outer', left_on=['id','workshop'], right_on=['id','workshop'])

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1	1	5.0	1.0
    1	2	2		f	2	1	4.0	1.0
    2	3	1		f	2	2	4.0	3.0
    3	4	2		f	3	1	NaN	3.0
    4	5	1		m	4	5	NaN	NaN
    5	6	2		m	5	4	NaN	NaN
    6	7	1		m	5	3	NaN	NaN
    7	8	2		m	4	5	NaN	NaN
     

     


    7. Python - dfply

     

    Python Programming
    import pandas as pd
    from dfply import *
    
    mydata   = pd.read_csv("c:/work/data/mydata.csv",sep=",",
                                                dtype={'id':object,'workshop':object,
                                                       'q1':int, 'q2':int, 'q3':float, 'q4':int},
                                                na_values=['NaN'],skipinitialspace =True)
    
    withmooc= mydata.copy()
    
    # 모든 변수 선택하기.
    withmooc

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1	1	5.0	1
    1	2	2		f	2	1	4.0	1
    2	3	1		f	2	2	4.0	3
    3	4	2		f	3	1	NaN	3
    4	5	1		m	4	5	2.0	4
    5	6	2		m	5	4	5.0	5
    6	7	1		m	5	3	4.0	4
    7	8	2		m	4	5	5.0	5

     

     

     
    • 두 개의 q변수를 포함한 데이터 프레임 생성.
    Python Programming
    myleft = mydata >> select("id","workshop","gender","q1","q2")
    
    myleft

     

    Results
    	id	workshop	gender	q1	q2
    0	1	1		f	1	1
    1	2	2		f	2	1
    2	3	1		f	2	2
    3	4	2		f	3	1
    4	5	1		m	4	5
    5	6	2		m	5	4
    6	7	1		m	5	3
    7	8	2		m	4	5

     

     

     
    • 두 개의 q변수를 포함한 데이터 프레임 생성.
    Python Programming
    myright = mydata >> select("id","workshop","q3","q4")
    
    myright

     

    Results
    	id	workshop	q3	q4
    0	1	1		5.0	1
    1	2	2		4.0	1
    2	3	1		4.0	3
    3	4	2		NaN	3
    4	5	1		2.0	4
    5	6	2		5.0	5
    6	7	1		4.0	4
    7	8	2		5.0	5

     

     

     
    • ID 변수를 기준 변수로 하여 두 개의 데이터 프레임을 가로 결합(Merge) 한다.
    • “workshop” 변수는 양쪽 데이터 프레임에 존재하기 때문에, 데이터 프레임 Merge에는 이용되지 않고, R-Project는 workshop.x와 workshop.y의 변수명으로 저장한다.
    • bind_cols 사용
    Python Programming
    myleft >> bind_cols(myright)

     

    Results
    	id	workshop	gender	q1	q2	id	workshop	q3	q4
    0	1	1		f	1	1	1	1		5.0	1
    1	2	2		f	2	1	2	2		4.0	1
    2	3	1		f	2	2	3	1		4.0	3
    3	4	2		f	3	1	4	2		NaN	3
    4	5	1		m	4	5	5	1		2.0	4
    5	6	2		m	5	4	6	2		5.0	5
    6	7	1		m	5	3	7	1		4.0	4
    7	8	2		m	4	5	8	2		5.0	5

     


    • inner_join 사용
    Python Programming
    both  = myleft >> inner_join(myright, by = "id")
    
    both

     

    Results
    	id	workshop_x	gender	q1	q2	workshop_y	q3	q4
    0	1	1		f	1	1	1		5.0	1
    1	2	2		f	2	1	2		4.0	1
    2	3	1		f	2	2	1		4.0	3
    3	4	2		f	3	1	2		NaN	3
    4	5	1		m	4	5	1		2.0	4
    5	6	2		m	5	4	2		5.0	5
    6	7	1		m	5	3	1		4.0	4
    7	8	2		m	4	5	2		5.0	5

     


    • ID와 Workshop변수를 기준으로 데이터 프레임을 Merge.
    • 원 데이터프레임으로 완벽하게 재생성한다.
    Python Programming
    both = myleft >> inner_join(myright, by = ["id","workshop"])
    
    both

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1	1	5.0	1
    1	2	2		f	2	1	4.0	1
    2	3	1		f	2	2	4.0	3
    3	4	2		f	3	1	NaN	3
    4	5	1		m	4	5	2.0	4
    5	6	2		m	5	4	5.0	5
    6	7	1		m	5	3	4.0	4
    7	8	2		m	4	5	5.0	5

     

     


    • ID와 Workshop변수를 기준으로 데이터 프레임을 Merge.
    • 각 데이터프레임에서 기준 변수명이 다른 경우 사용하는 방법이다.
    • 여기서는 두 개 데이터 프레임의 기준 변수명이 다르다고 가정하자.
    Python Programming
    both  = myleft >> inner_join(myright, by = ["id","workshop"])
    both

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1	1	5.0	1
    1	2	2		f	2	1	4.0	1
    2	3	1		f	2	2	4.0	3
    3	4	2		f	3	1	NaN	3
    4	5	1		m	4	5	2.0	4
    5	6	2		m	5	4	5.0	5
    6	7	1		m	5	3	4.0	4
    7	8	2		m	4	5	5.0	5

     

     

     
    Python Programming
    bot= myleft >> inner_join(myright, left_on  = ["id","workshop"], 
                                       right_on = ["id","workshop"])
    both

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1	1	5.0	1
    1	2	2		f	2	1	4.0	1
    2	3	1		f	2	2	4.0	3
    3	4	2		f	3	1	NaN	3
    4	5	1		m	4	5	2.0	4
    5	6	2		m	5	4	5.0	5
    6	7	1		m	5	3	4.0	4
    7	8	2		m	4	5	5.0	5

     

     

     
    • 실습 데이터 생성
    Python Programming
    myshort =  myright >> row_slice(list(range(0,4)))
    myshort

     

    Results
    	id	workshop	q3	q4
    0	1	1		5.0	1
    1	2	2		4.0	1
    2	3	1		4.0	3
    3	4	2		NaN	3

     

     

     
    • [INNER JOIN]
    Python Programming
    myleft >> inner_join(myshort, left_on  = ["id","workshop"], 
                                  right_on = ["id","workshop"])

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1	1	5.0	1
    1	2	2		f	2	1	4.0	1
    2	3	1		f	2	2	4.0	3
    3	4	2		f	3	1	NaN	3

     

     
    • [LEFT JOIN]
    Python Programming
    myleft >> left_join(myshort, left_on  = ["id","workshop"],
                                 right_on = ["id","workshop"])

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1	1	5.0	1.0
    1	2	2		f	2	1	4.0	1.0
    2	3	1		f	2	2	4.0	3.0
    3	4	2		f	3	1	NaN	3.0
    4	5	1		m	4	5	NaN	NaN
    5	6	2		m	5	4	NaN	NaN
    6	7	1		m	5	3	NaN	NaN
    7	8	2		m	4	5	NaN	NaN

     


    • [RIGHT JOIN]
    Python Programming
    myleft >> right_join(myshort, left_on  = ["id","workshop"],
                                  right_on = ["id","workshop"])

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1	1	5.0	1
    1	2	2		f	2	1	4.0	1
    2	3	1		f	2	2	4.0	3
    3	4	2		f	3	1	NaN	3

     

    • [OUTER JOIN]
    Python Programming
    myleft >> full_join(myshort, left_on  = ["id","workshop"],
                                  right_on = ["id","workshop"])

     

    Results
    	id	workshop	gender	q1	q2	q3	q4
    0	1	1		f	1	1	5.0	1.0
    1	2	2		f	2	1	4.0	1.0
    2	3	1		f	2	2	4.0	3.0
    3	4	2		f	3	1	NaN	3.0
    4	5	1		m	4	5	NaN	NaN
    5	6	2		m	5	4	NaN	NaN
    6	7	1		m	5	3	NaN	NaN
    7	8	2		m	4	5	NaN	NaN

     

     


     

    통계프로그램 비교 목록(Proc sql, SAS, SPSS, R 프로그래밍, R Tidyverse, Python Pandas, Python Dfply)
    [Oracle, Pandas, R Prog, Dplyr, Sqldf, Pandasql, Data.Table] 오라클 함수와 R & Python 비교 사전 목록 링크
    [SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE]
    SQL EMP 예제로 만나는 테이블 데이터 처리 방법 리스트 링크
    반응형

    댓글