본문 바로가기

빅데이터과정/R

#48_140821_R_JOIN

728x90

# JOIN




 

오라클 조인문법 사용

 

R에서 조인문법 구현

merge 함수 사용

 

 

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