본문 바로가기
통계프로그램 비교 시리즈/프로그래밍비교(Oracle,Python,R,SAS)

[데이터 추출] 최소값과 최대값 계산하기 - 108

by 기서무나구물 2022. 12. 5.

포스팅 목차

     

    108. Display those employees whose salary is equal to average of maximum and minimum. ( = 에서 > 으로 변경)

     

    * 최대 급여와 최소급여의 평균보다 더 많은 급여를 수령하는 직원의 정보를 출력하시오.


    • Oracle : min(), max()
    • 파이썬 Pandas : .loc[], min(), max(), query()
    • R 프로그래밍 : min(), max(), subset()
    • R Dplyr Package : min(), max(), filter()
    • R sqldf Package : min(), max()
    • Python pandasql Package : min(), max()
    • R data.table Package : min(), max()
    • SAS Proc SQL : min(), max()
    • SAS Data Step : PROC SUMMARY의 min, max 옵션, Macro 변수 할당 방식
    • Python Dfply Package : min(), max()
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    서브쿼리내에서 EMP테이블에서 최대 급여와 최소 급여의 평균을 계산 후 이 값보다 더 많은 급여를 수령하는 직원의 정보를 출력한다.

     

    Oracle Programming
    select * 
    from   emp 
    where  sal > (select (max(sal)+min(sal))/2 from emp);

     


    2. Python Pandas(파이썬)

    최대 급여와 최소 급여의 평균보다 더 많은 급여를 수령하는 직원의 정보를 출력한다.

     

    Python Programming
    emp.loc[ emp['sal']> (emp['sal'].max()+emp['sal'].min())/2, ]

     

    Results
      empno ename job mgr hiredate sal comm deptno
    3 7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN 20
    7 7788 SCOTT ANALYST 7566.0 1982/12/09 3000 NaN 20
    8 7839 KING PRESIDENT NaN 1981/11/17 5000 NaN 10
    12 7902 FORD ANALYST 7566.0 1981/12/03 3000 NaN 20

     


    query() 함수를 사용하여서 최대 급여와 최소 급여의 평균보다 더 많은 급여를 수령하는 직원의 정보를 선택한다.

     

    Python Programming
    emp.query('sal> (sal.max()+sal.min())/2')

     


    Results
      empno ename job mgr hiredate sal comm deptno
    3 7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN 20
    7 7788 SCOTT ANALYST 7566.0 1982/12/09 3000 NaN 20
    8 7839 KING PRESIDENT NaN 1981/11/17 5000 NaN 10
    12 7902 FORD ANALYST 7566.0 1981/12/03 3000 NaN 20

     


    3. R Programming (R Package)

    최대 급여와 최소 급여의 평균보다 더 많은 급여를 수령하는 직원의 정보를 출력한다.

     

    R Programming
    %%R
    
    emp[ emp$sal>(max(emp$sal)+min(emp$sal))/2, ]

     

    Results
    # A tibble: 4 x 8
      empno ename job         mgr hiredate     sal  comm deptno
      <dbl> <chr> <chr>     <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7566 JONES MANAGER    7839 1981-04-02  2975    NA     20
    2  7788 SCOTT ANALYST    7566 1982-12-09  3000    NA     20
    3  7839 KING  PRESIDENT    NA 1981-11-17  5000    NA     10
    4  7902 FORD  ANALYST    7566 1981-12-03  3000    NA     20

     


    subset() 함수를 사용하여서 최대 급여와 최소 급여의 평균보다 더 많은 급여를 수령하는 직원의 정보를 선택한다.

     

    R Programming
    %%R
    
    subset(emp,sal>(max(emp$sal)+min(emp$sal))/2)

     

    Results
    # A tibble: 4 x 8
      empno ename job         mgr hiredate     sal  comm deptno
      <dbl> <chr> <chr>     <dbl> <date>     <dbl> <dbl>  <dbl>
    1  7566 JONES MANAGER    7839 1981-04-02  2975    NA     20
    2  7788 SCOTT ANALYST    7566 1982-12-09  3000    NA     20
    3  7839 KING  PRESIDENT    NA 1981-11-17  5000    NA     10
    4  7902 FORD  ANALYST    7566 1981-12-03  3000    NA     20

     


    4. R Dplyr Package

    dplyr::mutate() 함수를 사용하여 최대 급여와 최소 급여를 신규 변수로 생성하고, dplyr::filter() 함수를 사용하여서 최대 급여와 최소 급여의 평균보다 더 많은 급여를 수령하는 직원의 정보를 선택한다.

     

    R Programming
    %%R
    
    emp %>% 
      dplyr::mutate(max_sal = max(sal), min_sal = min(sal)) %>%
      dplyr::filter(sal > (max_sal + min_sal)/2)

     

    Results
    # A tibble: 4 x 10
      empno ename job         mgr hiredate     sal  comm deptno max_sal min_sal
      <dbl> <chr> <chr>     <dbl> <date>     <dbl> <dbl>  <dbl>   <dbl>   <dbl>
    1  7566 JONES MANAGER    7839 1981-04-02  2975    NA     20    5000     800
    2  7788 SCOTT ANALYST    7566 1982-12-09  3000    NA     20    5000     800
    3  7839 KING  PRESIDENT    NA 1981-11-17  5000    NA     10    5000     800
    4  7902 FORD  ANALYST    7566 1981-12-03  3000    NA     20    5000     800

     


    5. R sqldf Package

    서브쿼리내에서 EMP테이블에서 최대 급여와 최소 급여의 평균을 계산 후 이 값보다 더 많은 급여를 수령하는 직원의 정보를 출력한다.

     

    R Programming
    %%R
    
    sqldf(" select * 
            from   emp 
            where  sal > (select (max(sal)+min(sal))/2 from emp);")

     

    Results
      empno ename       job  mgr   hiredate  sal comm deptno
    1  7566 JONES   MANAGER 7839 1981-04-02 2975   NA     20
    2  7788 SCOTT   ANALYST 7566 1982-12-09 3000   NA     20
    3  7839  KING PRESIDENT   NA 1981-11-17 5000   NA     10
    4  7902  FORD   ANALYST 7566 1981-12-03 3000   NA     20

     


    6. Python pandasql Package

    서브쿼리내에서 EMP테이블에서 최대 급여와 최소 급여의 평균을 계산 후 이 값보다 더 많은 급여를 수령하는 직원의 정보를 출력한다.

     

    Python Programming
    ps.sqldf(" select *       \
               from   emp     \
               where  sal>(select (max(sal)+min(sal))/2 from emp);")

     


    Results
      empno ename job mgr hiredate sal comm deptno
    0 7566 JONES MANAGER 7839.0 1981/04/02 2975 None 20
    1 7788 SCOTT ANALYST 7566.0 1982/12/09 3000 None 20
    2 7839 KING PRESIDENT NaN 1981/11/17 5000 None 10
    3 7902 FORD ANALYST 7566.0 1981/12/03 3000 None 20

     


    7. R data.table Package

    최대 급여와 최소 급여의 평균보다 더 많은 급여를 수령하는 직원의 정보를 출력한다.

     

    R Programming
    %%R
    
    DT          <- data.table(emp)
    dept_DT     <- data.table(dept)
    salgrade_DT <- data.table(salgrade)
    
    DT[sal > ((max(sal)+min(sal))/2),]

     

    Results
       empno ename       job  mgr   hiredate  sal comm deptno
    1:  7566 JONES   MANAGER 7839 1981-04-02 2975   NA     20
    2:  7788 SCOTT   ANALYST 7566 1982-12-09 3000   NA     20
    3:  7839  KING PRESIDENT   NA 1981-11-17 5000   NA     10
    4:  7902  FORD   ANALYST 7566 1981-12-03 3000   NA     20

     


    8. SAS Proc SQL

    서브쿼리내에서 EMP테이블에서 최대 급여와 최소 급여의 평균을 계산 후 이 값보다 더 많은 급여를 수령하는 직원의 정보를 출력한다.

     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        select * 
        from   emp 
        where  sal > (select (max(sal)+min(sal))/2 from emp);;
    QUIT;
    PROC PRINT;RUN;

     


    Results
    OBS empno ename job mgr hiredate sal comm deptno
    1 7566 JONES MANAGER 7839 1981-04-02 2975 . 20
    2 7788 SCOTT ANALYST 7566 1982-12-09 3000 . 20
    3 7839 KING PRESIDEN . 1981-11-17 5000 . 10
    4 7902 FORD ANALYST 7566 1981-12-03 3000 . 20

     


    sas 에서는 group by 없이 having 사용 가능 : inline view없이 한 번에 처리 가능;

     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_2 AS
        select A.*,
               (max(sal)+min(sal))/2 AS SAL_AVG
        from   emp A
        having sal > (max(sal)+min(sal))/2;
    QUIT;
    PROC PRINT;RUN;

     


    Results
    OBS empno ename job mgr hiredate sal comm deptno SAL_AVG
    1 7566 JONES MANAGER 7839 1981-04-02 2975 . 20 2900
    2 7788 SCOTT ANALYST 7566 1982-12-09 3000 . 20 2900
    3 7839 KING PRESIDEN . 1981-11-17 5000 . 10 2900
    4 7902 FORD ANALYST 7566 1981-12-03 3000 . 20 2900

     


    9. SAS Data Step

     

    SAS Programming
    %%SAS sas
    
    PROC SUMMARY DATA=EMP;
         VAR SAL;
         OUTPUT OUT=EMP_AVG(DROP=_:) MIN=SAL_MIN MAX=SAL_MAX;
    RUN;
    
    DATA STATSAS_3; 
     SET EMP_AVG; 
         DO I=1 TO KOBS; 
            SET EMP NOBS=KOBS POINT=I;
            SAL_AVG = (SAL_MAX+SAL_MIN)/2;
            IF SAL  > (SAL_MAX+SAL_MIN)/2 THEN OUTPUT;
         END;    
    RUN;
    
    PROC PRINT;RUN;

     

    Results
    OBS SAL_MIN SAL_MAX empno ename job mgr hiredate sal comm deptno SAL_AVG
    1 800 5000 7566 JONES MANAGER 7839 1981-04-02 2975 . 20 2900
    2 800 5000 7788 SCOTT ANALYST 7566 1982-12-09 3000 . 20 2900
    3 800 5000 7839 KING PRESIDEN . 1981-11-17 5000 . 10 2900
    4 800 5000 7902 FORD ANALYST 7566 1981-12-03 3000 . 20 2900

     


    • Macro 변수 할당 방식

     

    SAS Programming
    %%SAS sas
    
    PROC SQL noprint;
      select (max(sal)+min(sal))/2 into :SAL_AVG 
      from   emp A;
    QUIT;
    %put TNote:  SAL_AVG  = &SAL_AVG;
    
    DATA STATSAS_4;
     SET emp;
         IF SAL > &SAL_AVG THEN OUTPUT;
    RUN;
    PROC PRINT;RUN;

     


    Results
    OBS empno ename job mgr hiredate sal comm deptno
    1 7566 JONES MANAGER 7839 1981-04-02 2975 . 20
    2 7788 SCOTT ANALYST 7566 1982-12-09 3000 . 20
    3 7839 KING PRESIDEN . 1981-11-17 5000 . 10
    4 7902 FORD ANALYST 7566 1981-12-03 3000 . 20

     


    • Data step의 Macro 변수 할당 방식

     

    SAS Programming
    %%SAS sas
    
    PROC SUMMARY DATA=EMP;
         VAR SAL;
         OUTPUT OUT=EMP_AVG(DROP=_:) MIN=SAL_MIN MAX=SAL_MAX;
    RUN;
    
    DATA _NULL_;
     SET EMP_AVG;
         CALL SYMPUT('SAL_AVG',(SAL_MAX+SAL_MIN)/2);
    RUN;
    %put TNote:  SAL_AVG  = &SAL_AVG;
    
    DATA STATSAS_5;
     SET emp;
         IF SAL >= &SAL_AVG THEN OUTPUT;
    RUN;
    PROC PRINT;RUN;

     


    Results
    OBS empno ename job mgr hiredate sal comm deptno
    1 7566 JONES MANAGER 7839 1981-04-02 2975 . 20
    2 7788 SCOTT ANALYST 7566 1982-12-09 3000 . 20
    3 7839 KING PRESIDEN . 1981-11-17 5000 . 10
    4 7902 FORD ANALYST 7566 1981-12-03 3000 . 20

     


    10. Python Dfply Package

     

    Python Programming
    emp >> mutate(max_sal = X.sal.max(), min_sal = X.sal.min()) >> filter_by(X.sal > ( (X.max_sal + X.min_sal) / 2) )

     

    Results
      empno ename job mgr hiredate sal comm deptno max_sal min_sal
    3 7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN 20 5000 800
    7 7788 SCOTT ANALYST 7566.0 1982/12/09 3000 NaN 20 5000 800
    8 7839 KING PRESIDENT NaN 1981/11/17 5000 NaN 10 5000 800
    12 7902 FORD ANALYST 7566.0 1981/12/03 3000 NaN 20 5000 800

     


    [SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE]   SQL EMP 예제로 만나는 테이블 데이터 전처리 방법 리스트

    반응형

    댓글