티스토리 뷰
데이터 병합
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(emp, dept, by.x = 'DEPTNO1', by.y = 'DEPTNO2')[ , c("ENAME","DEPTNO","DNAME")]
2. merge() 함수의 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>
# 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
'R > Process' 카테고리의 다른 글
[R] 그룹 연산 - tapply, aggregate 함수 (0) | 2019.01.08 |
---|---|
[R] 데이터에서 최소(min), 최대(max)를 갖는 색인 출력 - which.min(), which.max() (0) | 2019.01.07 |
[R] 데이터 구조 변경 - stack, unstack (0) | 2019.01.07 |
[R] 데이터 정렬 - order(), sort(), orderBy() (0) | 2019.01.07 |
[R] 데이터 요약 통계, 분위수 확인 - summary(), quantile(), summartBy() (0) | 2019.01.07 |