Skip Headers

SAS  SPSS  R-PROJECT  S-PLUS  PROC-SQL

통 계
프 로 그 램 비 교

Go to Documentation Home
HOME
Go to Book List
PRO_home
Go to Table of Contents
연구회
Go to Index
자료실
Go to Master Index
R-PROJECT
Go to Feedback page
MAIL

Go to previous page
Previous
Go to next page
Next

10. Joining / Merging 데이터 프레임.


1. SAS
2. SPSS
3. R-PROJECT
4. S-PLUS
5. PROC SQL

 


1. SAS

MAIN

 

* 테스트 데이터 생성;

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;

 

PROC SORT data=myleft;

     BY id workshop;

RUN;

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

 

PROC SORT data=myright;

     BY id workshop;

RUN;

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

 

* 소트된 데이터세트을 가로 결합;

DATA both;

 MERGE myleft myright;

     BY id workshop;

RUN;

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

 

PROC SORT data=myshort;

     BY id workshop;

RUN;

id    workshop    q3    q4

 1        1        5     1

 2        2        4     1

 3        1        4     3

 4        2        .     3

 

* 각 결합에 대한 예제;

* Inner join, Left Join, Right Join;

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;

* 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



2. SPSS

MAIN

 

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.

 


3. R-PROJECT

MAIN

* JOING / MERGING 데이터 세트를 위한 R-Project 프로그램.

# 아래 테이블을 읽을 때 row.names="id" 는 이용되지 않는다. 매칭을 위해 ID 변수가 필요하기 때문에 변수로 유지한다.

mydata<-read.table("c:\\data/mydata.csv",header=TRUE,sep=",")

print(mydata)

 

# 두개의 q변수를 포함한 데이터 프레임 생성.

myleft<-mydata[ c("id","workshop","gender","q1","q2") ]

print(myleft)

  id workshop gender q1 q2

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변수를 포함한 데이터 프레임 생성.

myright<-mydata[ c("id","workshop","q3","q4") ]

print(myright)

  id workshop q3 q4

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의 변수명으로 저장한다.

both<-merge(myleft,myright,by="id")

print(both)

  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.

# 원 데이터프레임으로 완벽하게 재생성한다.

both<-merge(myleft,myright,by=c("id","workshop"))

print(both)

 

  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.

# 각 데이터프레임에서 기준 변수명이 다른 경우 사용하는 방법이다.

# 여기서는 두개 데이터 프레임의 기준 변수명이 다르다고 가정하자.

both<-merge(myleft,myright,by.x=c("id","workshop"),

                           by.y=c("id","workshop"))

print(both)


  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

 

myshort<-myright[1:4,]

  id workshop q3 q4

1  1        1  5  1

2  2        2  4  1

3  3        1  4  3

4  4        2 NA  3

 

* INNER JOIN

merge(myleft,myshort,by.x=c("id","workshop"),

                     by.y=c("id","workshop"),all=F)

  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

merge(myleft,myshort,by.x=c("id","workshop"),

                     by.y=c("id","workshop"),all.x=T)

  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

merge(myleft,myshort,by.x=c("id","workshop"),

                     by.y=c("id","workshop"),all.y=T)

  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

merge(myleft,myshort,by.x=c("id","workshop"),

                     by.y=c("id","workshop"),all=T)

  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

 

 


4. S-PLUS

MAIN

 

 

# 아래 테이블을 읽을 때 row.names="id" 는 이용되지 않는다. 매칭을 위해 ID 변수가 필요하기 때문에 변수로 유지한다.

mydata<-read.table ("c:/data/mydata.csv",header=TRUE,

  sep=",")

print(mydata)

 

# 두개의 q변수를 포함한 데이터 프레임 생성.

myleft<-mydata[ c("id","workshop","gender","q1","q2") ]

print(myleft)

  id workshop gender q1 q2

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변수를 포함한 데이터 프레임 생성.

myright<-mydata[ c("id","workshop","q3","q4") ]

print(myright)

  id workshop q3 q4

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의 변수명으로 저장한다.

both<-merge(myleft,myright,by="id")

print(both)

  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.

# 원 데이터프레임으로 완벽하게 재생성한다.

both<-merge(myleft,myright,by=c("id","workshop"))

print(both)

  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.

# 각 데이터프레임에서 기준 변수명이 다른 경우 사용하는 방법이다.

# 여기서는 두개 데이터 프레임의 기준 변수명이 다르다고 가정하자.

both<-merge(myleft,myright,by.x=c("id","workshop"),

                           by.y=c("id","workshop"))

print(both)


  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

 

myshort<-myright[1:4,]

  id workshop q3 q4

1  1        1  5  1

2  2        2  4  1

3  3        1  4  3

4  4        2 NA  3

 

* INNER JOIN

merge(myleft,myshort,by.x=c("id","workshop"),

                     by.y=c("id","workshop"),all=F)

  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

merge(myleft,myshort,by.x=c("id","workshop"),

                     by.y=c("id","workshop"),all.x=T)

  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

merge(myleft,myshort,by.x=c("id","workshop"),

                     by.y=c("id","workshop"),all.y=T)

  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

merge(myleft,myshort,by.x=c("id","workshop"),

                     by.y=c("id","workshop"),all=T)

  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. PROC SQL

MAIN

* 중복 시 SAS의 MERGE와 차이 발생

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;

 

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;

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

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;

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

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;

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

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;

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