티스토리 뷰

반응형

데이터 병합



1. merge() 함수



# 오라클의 JOIN 연산과 유사 

merge(x, y,         # 조인할 두 데이터 프레임, 

      by = ,           # 조인 컬럼(양쪽 컬럼 이름이 같을 경우) 

      by.x = by,     # (첫 번째 데이터 조인 컬럼, 조인 컬럼이 다수이면 벡터로 전달)

      by.y = by,    # (두 번째 데이터 조인 컬럼, 조인 컬럼이 다수이면 벡터로 전달)   

      all = FALSE,  # Full(x,y) Outer Join

      all.x = all,    # Left(x) Outer Join

      all.y = all)    # Right(y) Outer Join


 merge()함수는 오라클에서 테이블 참조 시 사용했던 JOIN과 유사합니다.

merge()함수는 데이터 연결만 가능하고, 필요한 정보 추출은 색인이 필요합니다.

단점으로 한 번에 3개 이상의 데이터 조인이 불가하여 만일, 세 테이블 조인 시, 먼저 두 테이블을 merge()함수에 적용하고 그 결과와 남은 테이블을 다시 함수에 적용해야 합니다. 또한, 데이터 비교 시 equal-join(=동등비교)만 가능합니다.


# emp와 dept 테이블의 조인 

> emp <- read.csv("emp.csv", stringsAsFactors = F, encoding = 'utf-8')

> dept <- read.csv("dept.csv", stringsAsFactors = F, encoding = 'utf-8')

> emp

   EMPNO  ENAME       JOB  MGR        HIREDATE  SAL COMM DEPTNO

1   7369  SMITH     CLERK 7902 1980-12-17 0:00  800   NA     20

2   7499  ALLEN  SALESMAN 7698 1981-02-20 0:00 1600  300     30

...

13  7902   FORD   ANALYST 7566 1981-12-03 0:00 3000   NA     20

14  7934 MILLER     CLERK 7782 1982-01-23 0:00 1300   NA     10

> dept

  DEPTNO      DNAME      LOC

1     10 ACCOUNTING NEW YORK

2     20   RESEARCH   DALLAS

3     30      SALES  CHICAGO

4     40 OPERATIONS   BOSTON


# emp와 dept의 join (조인 컬럼 이름이 같을 경우)

> merge(emp, dept, by = 'DEPTNO')[ , c("ENAME","DEPTNO","DNAME")]    

    ENAME DEPTNO      DNAME

1   CLARK     10 ACCOUNTING

2    KING     10 ACCOUNTING

...

13 TURNER     30      SALES

14  JAMES     30      SALES

 emp와 dept의 join  (조인 컬럼 이름이 다를 경우)

> merge(empdept, by.x = 'DEPTNO1', by.y = 'DEPTNO2')[ , c("ENAME","DEPTNO","DNAME")]  



# Q. student.csv 파일과 department.csv 파일을 불러와서
> student <- read.csv("student.csv", stringsAsFactors = F, encoding = 'utf-8')
> department <- read.csv("department.csv", stringsAsFactors = F, encoding = 'utf-8')
# 1) 각 학생의 이름, 학년, 제1전공학과명 출력
> merge(student, department, by.x = 'DEPTNO1', by.y = 'DEPTNO')[ , c("NAME","GRADE","DNAME")]
     NAME GRADE            DNAME
1  이진욱     4     컴퓨터공학과
2  김신영     3     컴퓨터공학과
...
18 오나라     3       기계공학과
19 구유미     3     문헌정보학과
20 노정호     2     문헌정보학과



2merge() 함수의 Outer Join


# Outer Join

> merge(std, professor, by.x = 'PROFNO', by.y = 'PROFNO',

            all.x = TRUE)[,c('NAME.x','NAME.y')]    # 첫 번째 데이터 기준 Outer Join

   NAME.x NAME.y

1  이진욱 조인형

2  일지매 박승곤

3  김신영 박승곤

...

18 김주현   <NA>

19 이윤나   <NA>

20   허우   <NA>

> merge(std, professor, by.x = 'PROFNO', by.y = 'PROFNO',

            all.y = TRUE)[,c('NAME.x','NAME.y')]   # 두 번째 데이터 기준 Outer Join

   NAME.x NAME.y

1  이진욱 조인형

...

4    <NA> 김수현

...

18   <NA> 차범철

19   <NA>   바비

...

22 노정호   허은

> merge(std, professor, by.x = 'PROFNO', by.y = 'PROFNO',

             all = TRUE)[,c('NAME.x','NAME.y')]    # 양쪽 데이터 기준 Outer Join

   NAME.x NAME.y

1  이진욱 조인형

...

8    <NA> 주승재

9    <NA> 김도형

...

16 김문호 박원범

17 오나라 박원범

...

26 이윤나   <NA>

27   허우   <NA>



3merge() 함수의 Self Join


# Self Join

# emp를 사용하여 각 직원의 이름, SAL과 상위관리자 이름, SAL을 동시 출력(단, 상위관리자가 없는 경우도 함께 출력)

> emp <- read.csv("emp.csv", stringsAsFactors = F)

> merge(emp, emp, by.x='MGR', by.y='EMPNO',all.x=TRUE)[,c('ENAME.x','SAL.x','ENAME.y','SAL.y')]

   ENAME.x SAL.x ENAME.y SAL.y

1    SCOTT  3000   JONES  2975

2     FORD  3000   JONES  2975

...

13   SMITH   800    FORD  3000

14    KING  5000    <NA>    NA


반응형
댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday