# JOIN
l 오라클 조인문법 사용
l R에서 조인문법 구현
- merge 함수 사용
n R에서 조인 사용
>> 이름과 월급, 부서위치와 부서번호를 출력
> merge(emp[ ,c("ename","sal","deptno")], dept[ ,c("deptno","loc") ],by="deptno" ) deptno ename sal loc 1 10 KING 5000 NEW YORK 2 10 MILLER 1300 NEW YORK 3 10 CLARK 2450 NEW YORK 4 20 SMITH 800 DALLAS 5 20 JONES 2975 DALLAS 6 20 FORD 3000 DALLAS 7 20 ADAMS 1100 DALLAS ………………………………. - 양쪽에 by에 쓴 deptno가 양쪽에 있어야한다
|
>> DALLAS에서 근무하는 사원들의 이름과 부서위치를 출력
> x[x$loc=='DALLAS',c("ename","loc")] ename loc 4 SMITH DALLAS 5 JONES DALLAS 6 FORD DALLAS 7 ADAMS DALLAS 8 SCOTT DALLAS
>> outer 조인하여 결과 출력
> merge(emp,dept,by="deptno",all.x=T)[,c("ename","loc")] ename loc 1 KING NEW YORK 2 MILLER NEW YORK 3 CLARK NEW YORK 4 SMITH DALLAS 5 JONES DALLAS 6 FORD DALLAS 7 ADAMS DALLAS 8 SCOTT DALLAS 9 ALLEN CHICAGO 10 BLAKE CHICAGO 11 MARTIN CHICAGO 12 TURNER CHICAGO 13 WARD CHICAGO 14 JAMES CHICAGO 15 JACK <NA>
> merge(emp,dept,by="deptno",all.y=T)[,c("ename","loc")] ename loc 1 KING NEW YORK 2 MILLER NEW YORK 3 CLARK NEW YORK 4 SMITH DALLAS 5 JONES DALLAS 6 FORD DALLAS 7 ADAMS DALLAS 8 SCOTT DALLAS 9 ALLEN CHICAGO 10 BLAKE CHICAGO 11 MARTIN CHICAGO 12 TURNER CHICAGO 13 WARD CHICAGO 14 JAMES CHICAGO 15 <NA> BOSTON - x, y가 의미하는 바는 x는 emp테이블, y는 deptno 테이블을 의미한다
|
>> full outer join 으로 출력
select e.ename, d.loc from emp e full outer join dept d on (e.deptno=d.deptno);
> merge(emp,dept,by="deptno",all.x=T, all.y=T)[,c("ename","loc")] ename loc 1 KING NEW YORK 2 MILLER NEW YORK 3 CLARK NEW YORK 4 SMITH DALLAS 5 JONES DALLAS 6 FORD DALLAS 7 ADAMS DALLAS 8 SCOTT DALLAS 9 ALLEN CHICAGO 10 BLAKE CHICAGO 11 MARTIN CHICAGO 12 TURNER CHICAGO 13 WARD CHICAGO 14 JAMES CHICAGO 15 <NA> BOSTON 16 JACK <NA>
|
>> (self join 결과를 출력) 각 사원의 매니저 출력
> x <- merge(emp,emp,by.x="mgr",by.y="empno") 경고메시지: In merge.data.frame(emp, emp, by.x = "mgr", by.y = "empno") : column name ‘mgr’ is duplicated in the result - 경고메세지는 merge의 결과값이 mgr이 구분이 안되기 떄문에 오류를 출력한다 > x[,c("ename.x","ename.y")] ename.x ename.y 1 SCOTT JONES 2 FORD JONES 3 ALLEN BLAKE 4 WARD BLAKE 5 JAMES BLAKE 6 TURNER BLAKE 7 MARTIN BLAKE …………………………………
|
>> 부서위치, 부서위치별 토탈월급을 출력
> x <- merge(emp,dept,by="deptno") > x deptno empno ename job mgr hiredate sal comm dname loc 1 10 7839 KING PRESIDENT NA 1981-11-17 5000 NA ACCOUNTING NEW YORK 2 10 7934 MILLER CLERK 7782 1982-01-23 1300 NA ACCOUNTING NEW YORK 3 10 7782 CLARK MANAGER 7839 1981-06-09 2450 NA ACCOUNTING NEW YORK 4 20 7369 SMITH CLERK 7902 1980-12-17 800 NA RESEARCH DALLAS 5 20 7566 JONES MANAGER 7839 1981-04-02 2975 NA RESEARCH DALLAS 6 20 7902 FORD ANALYST 7566 1981-12-03 3000 NA RESEARCH DALLAS 7 20 7876 ADAMS CLERK 7788 1987-05-23 1100 NA RESEARCH DALLAS 8 20 7788 SCOTT ANALYST 7566 1987-04-19 3000 NA RESEARCH DALLAS 9 30 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 SALES CHICAGO 10 30 7698 BLAKE MANAGER 7839 1981-05-01 2850 NA SALES CHICAGO 11 30 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 SALES CHICAGO 12 30 7844 TURNER SALESMAN 7698 1981-09-08 1500 0 SALES CHICAGO 13 30 7521 WARD SALESMAN 7698 1981-02-22 1250 500 SALES CHICAGO 14 30 7900 JAMES CLERK 7698 1981-12-03 950 NA SALES CHICAGO > aggregate(sal~loc,x,sum) loc sal 1 CHICAGO 9400 2 DALLAS 10875 3 NEW YORK 8750
>> 부서위치, 부서위치별 토탈월급을 가로로 출력
> tapply(x$sal,x$loc,sum) BOSTON CHICAGO DALLAS NEW YORK NA 9400 10875 8750
>> 부서위치, 부서위치별 인원수를 가로로 출력
> tapply(x$empno,x$loc,length) BOSTON CHICAGO DALLAS NEW YORK NA 6 5 3
|
>> 직업, 직업별 토탈월급을 가로로 출력하시오
> tapply(sal,format(as.Date(hiredate),"%Y"),sum) 1980 1981 1982 1987 800 22825 4500 4100 - 위의 코드에서 list를 사용한 이유는 job과 deptno가 서로 다른 데이터 구조이므로 list 함수를 써야 한다
|
>> 각각 년도별, 직업별, 부서번호별, 토탈월급을 가로로 출력
> tapply(sal,list(job,deptno,format(as.Date(hiredate),"%Y")),sum) , , 1980 10 20 30 70 ANALYST NA NA NA NA CLERK NA 800 NA NA MANAGER NA NA NA NA PRESIDENT NA NA NA NA SALESMAN NA NA NA NA
, , 1981 10 20 30 70 ANALYST NA 3000 NA NA CLERK NA NA 950 NA MANAGER 2450 2975 2850 NA PRESIDENT 5000 NA NA NA SALESMAN NA NA 5600 NA ……………………………………………
|
'빅데이터과정 > R' 카테고리의 다른 글
#48_140821_R_SUBQUERY (0) | 2014.08.21 |
---|---|
#48_140821_R_COUNT (0) | 2014.08.21 |
#48_140821_R_GROUP 함수 (1) | 2014.08.21 |
#47_140819_R_함수 (0) | 2014.08.19 |
#47_140819_R_정렬 (0) | 2014.08.19 |