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

[Case When 조건문] 조건에 따라 값을 변경 - 145 (오라클 SQL, R, Python, SAS)

by 기서무나구물 2023. 1. 2.

포스팅 목차

    145. Print a list of employees displaying ‘Less Salary’ if less than 1500 if exactly 1500 display as ‘Exact Salary’ and if greater than 1500 display ‘More Salary’?

     

    * 조건문을 사용하여 급여가 1,500 미만이면 ‘Less Salary’를 출력하고, 정확하게 1,500이면 ‘Exact Salary’로 출력하고, 1,500 이상이면 ‘More Salary’를 출력하시오.


    • Oracle : CASE WHEN 조건문
    • 파이썬 Pandas : np.select(), if ~ elif ~ Else 조건문 분기, IF ~ ELSE 조건문, apply(), Lambda 함수
    • R 프로그래밍 : lapply(), function(x) 사용자 정의 함수, case_when 조건문, ifelse 조건문
    • R Dplyr Package : dplyr::case_when() 조건문
    • R sqldf Package : CASE WHEN 조건문
    • Python pandasql Package : CASE WHEN 조건문
    • R data.table Package : dplyr::case_when() 조건문
    • SAS Proc SQL : CASE WHEN 조건문
    • SAS Data Step : IF 조건문, Select 구문
    • Python Dfply Package : 사용자 정의 함수와 IF 조건문, make_symbolic(), np.select, apply(), lambda 함수
    • 파이썬 Base 프로그래밍 :

     


    1. Oracle(오라클)

    Case when 조건문을 사용하여서 직원 급여(‘sal’)가 1500 미만을 수령하면 ‘Less Salary’, 1500 이면 ‘Exact Salary, 1500 이상을 수령하면 ‘More Salary’를 출력한다.

     

    Oracle Programming
    select ename,sal,
           case when sal < 1500 then 'Less Salary'
                when sal = 1500 then 'Exact Salary'
                when sal > 1500 then 'More Salary'
           else 'ETC' end sal_grp
    from emp

     


    2. Python Pandas(파이썬)

    np.select 조건문을 사용하여서 직원 급여(‘sal’)가 1500 미만을 수령하면 ‘Less Salary’, 1500 이면 ‘Exact Salary, 1500 이상을 수령하면 ‘More Salary’를 출력한다. 급여를 사용자가 지정한 조건과 비교하여서 만족하는 경우 데이터를 변환하거나 특정 작업을 수행한다.

     

    Python Programming
    import copy
    
    withmooc = copy.copy(emp)
    withmooc
    
    withmooc['sal_grade'] = np.select( [ withmooc['sal'] <  1500,
                                         withmooc['sal'] == 1500,
                                         withmooc['sal'] >  1500 ],
               ['Less_Salary','Exact_Salary','More_Salary'] )
    withmooc.head()

     


    Results
      empno ename job mgr hiredate sal comm deptno sal_grade
    0 7369 SMITH CLERK 7902.0 1980/12/17 800 NaN 20 Less_Salary
    1 7499 ALLEN SALESMAN 7698.0 1981/02/20 1600 300.0 30 More_Salary
    2 7521 WARD SALESMAN 7698.0 1981/02/22 1250 500.0 30 Less_Salary
    3 7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN 20 More_Salary
    4 7654 MARTIN SALESMAN 7698.0 1981/09/28 1250 1400.0 30 Less_Salary

     


    get_category 함수 내에 if~elif 조건문을 사용하여서 직원 급여(‘sal’)를 기준으로 1500 미만을 수령하면 ‘Less Salary’, 1500 이면 ‘Exact Salary, 1500 이상을 수령하면 ‘More Salary’로 급여를 판단하는 함수를 작성한다. 작성된 함수를 사용하여 급여(‘sal’)가 포함된(조건을 만족하는) 구간의 급여 분류 기준에 따라 출력한다.

     

    Python Programming
    import copy
    
    withmooc = copy.copy(emp)
    withmooc
    
    def get_category(job):
        if   job < 1500   : cat = 'Less_Salary'
        elif job == 1500  : cat = 'Exact_Salary'
        elif job > 1500   : cat = 'More_Salary'
        else :              cat = 'Etc'
    
        return cat
    
    withmooc['deptno'] = withmooc['sal'].apply(lambda x : get_category(x))
    withmooc.head()

     


    Results
      empno ename job mgr hiredate sal comm deptno
    0 7369 SMITH CLERK 7902.0 1980/12/17 800 NaN Less_Salary
    1 7499 ALLEN SALESMAN 7698.0 1981/02/20 1600 300.0 More_Salary
    2 7521 WARD SALESMAN 7698.0 1981/02/22 1250 500.0 Less_Salary
    3 7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN More_Salary
    4 7654 MARTIN SALESMAN 7698.0 1981/09/28 1250 1400.0 Less_Salary

     


    lambda() 함수 내에 if ~ else 조건문을 사용하여서 직원 급여(‘sal’)가 1500 미만을 수령하면 ‘Less Salary’, 1500 이면 ‘Exact Salary, 1500 이상을 수령하면 ‘More Salary’를 출력한다. 급여를 사용자가 지정한 조건과 비교하여서 만족하는 경우 데이터를 변환하거나 특정 작업을 수행한다.

     

    Python Programming
    withmooc['sal_grade'] =  withmooc['sal'].apply(lambda x : 'Less_Salary' if x < 1500 else ('Exact_Salary' if x == 1500 else ('More_Salary' if x > 1500 else 'ETC')) ) 
    
    withmooc.head()

     


    Results
      empno ename job mgr hiredate sal comm deptno sal_grade
    0 7369 SMITH CLERK 7902.0 1980/12/17 800 NaN Less_Salary Less_Salary
    1 7499 ALLEN SALESMAN 7698.0 1981/02/20 1600 300.0 More_Salary More_Salary
    2 7521 WARD SALESMAN 7698.0 1981/02/22 1250 500.0 Less_Salary Less_Salary
    3 7566 JONES MANAGER 7839.0 1981/04/02 2975 NaN More_Salary More_Salary
    4 7654 MARTIN SALESMAN 7698.0 1981/09/28 1250 1400.0 Less_Salary Less_Salary

     


    3. R Programming (R Package)

    lapply() 함수의 FUN 인수에 case_when 조건문을 지정하여서 직원 급여(‘sal’)가 1500 미만을 수령하면 ‘Less Salary’, 1500 이면 ‘Exact Salary, 1500 이상을 수령하면 ‘More Salary’를 출력한다. 조건문은 급여를 사용자가 지정한 조건과 비교하여서 만족하는 경우에 데이터를 변환하거나 특정 작업을 수행한다. lapply() 함수는 인수(FUN=)로 지정한 함수를 적용하여 산출된 값을 리스트로 반환한다.

     

    R Programming
    %%R
    
    withmooc <- emp
    withmooc['sal_grade'] = lapply(withmooc['sal'], function(x) case_when(x  < 1500 ~ "Less_Salary",
                                                                           x == 1500 ~ "Exact_Salary",
                                                                           x  > 1500 ~ "More_Salary",) ) 
    
    withmooc[1:7, ]

     

    Results
    # A tibble: 7 x 9
      empno ename  job        mgr hiredate     sal  comm deptno sal_grade  
      <dbl> <chr>  <chr>    <dbl> <date>     <dbl> <dbl>  <dbl> <chr>      
    1  7369 SMITH  CLERK     7902 1980-12-17   800    NA     20 Less_Salary
    2  7499 ALLEN  SALESMAN  7698 1981-02-20  1600   300     30 More_Salary
    3  7521 WARD   SALESMAN  7698 1981-02-22  1250   500     30 Less_Salary
    4  7566 JONES  MANAGER   7839 1981-04-02  2975    NA     20 More_Salary
    5  7654 MARTIN SALESMAN  7698 1981-09-28  1250  1400     30 Less_Salary
    6  7698 BLAKE  MANAGER   7839 1981-03-01  2850    NA     30 More_Salary
    7  7782 CLARK  MANAGER   7839 1981-01-09  2450    NA     10 More_Salary

     


    ifelse 조건문을 사용하여서 직원 급여(‘sal’)가 1500 미만을 수령하면 ‘Less Salary’, 1500 이면 ‘Exact Salary, 1500 이상을 수령하면 ‘More Salary’를 출력한다. 급여를 사용자가 지정한 조건과 비교하여서 만족하는 경우 데이터를 변환하거나 특정 작업을 수행한다.

     

    R Programming
    %%R
    withmooc <- emp
    
    withmooc['sal_grade'] = ifelse(withmooc$sal < 1500 ,'Less_Salary',
                                   ifelse(withmooc$sal == 1500, 'Exact_Salary',
                                          ifelse(withmooc$sal > 1500 , 'More_Salary',
                                                        'ETC')))
    withmooc[1:7, ]

     

    Results
    # A tibble: 7 x 9
      empno ename  job        mgr hiredate     sal  comm deptno sal_grade  
      <dbl> <chr>  <chr>    <dbl> <date>     <dbl> <dbl>  <dbl> <chr>      
    1  7369 SMITH  CLERK     7902 1980-12-17   800    NA     20 Less_Salary
    2  7499 ALLEN  SALESMAN  7698 1981-02-20  1600   300     30 More_Salary
    3  7521 WARD   SALESMAN  7698 1981-02-22  1250   500     30 Less_Salary
    4  7566 JONES  MANAGER   7839 1981-04-02  2975    NA     20 More_Salary
    5  7654 MARTIN SALESMAN  7698 1981-09-28  1250  1400     30 Less_Salary
    6  7698 BLAKE  MANAGER   7839 1981-03-01  2850    NA     30 More_Salary
    7  7782 CLARK  MANAGER   7839 1981-01-09  2450    NA     10 More_Salary

     


    4. R Dplyr Package

    dplyr::case_when 조건문을 사용하여서 직원 급여(‘sal’)가 1500 미만을 수령하면 ‘Less Salary’, 1500 이면 ‘Exact Salary, 1500 이상을 수령하면 ‘More Salary’를 출력한다. 조건문은 급여를 사용자가 지정한 조건과 비교하여서 만족하는 경우 데이터를 변환하거나 특정 작업을 수행한다.

     

    R Programming
    %%R
    
    emp %>% 
      mutate(sal_grade = dplyr::case_when( sal  < 1500 ~ "Less_Salary",
                                           sal == 1500 ~ "Exact_Salary",
                                           sal >  1500 ~ "More_Salary",
                                           TRUE ~ "ETC"
                                         )
            ) %>%
      head(7)

     

    Results
    # A tibble: 7 x 9
      empno ename  job        mgr hiredate     sal  comm deptno sal_grade  
      <dbl> <chr>  <chr>    <dbl> <date>     <dbl> <dbl>  <dbl> <chr>      
    1  7369 SMITH  CLERK     7902 1980-12-17   800    NA     20 Less_Salary
    2  7499 ALLEN  SALESMAN  7698 1981-02-20  1600   300     30 More_Salary
    3  7521 WARD   SALESMAN  7698 1981-02-22  1250   500     30 Less_Salary
    4  7566 JONES  MANAGER   7839 1981-04-02  2975    NA     20 More_Salary
    5  7654 MARTIN SALESMAN  7698 1981-09-28  1250  1400     30 Less_Salary
    6  7698 BLAKE  MANAGER   7839 1981-03-01  2850    NA     30 More_Salary
    7  7782 CLARK  MANAGER   7839 1981-01-09  2450    NA     10 More_Salary

     


    5. R sqldf Package

    Case when 조건문을 사용하여서 직원 급여(‘sal’)가 1500 미만을 수령하면 ‘Less Salary’, 1500 이면 ‘Exact Salary, 1500 이상을 수령하면 ‘More Salary’를 출력한다.

    %%R
    
    sqldf( " select ename,sal, 
                    case when sal < 1500 then 'Less Salary'
                         when sal = 1500 then 'Exact_Salary'
                         when sal > 1500 then 'More_Salary'
                    else 'Etc' end sal_grade
              from emp" ) %>% head(7)

     

       ename  sal   sal_grade
    1  SMITH  800 Less Salary
    2  ALLEN 1600 More_Salary
    3   WARD 1250 Less Salary
    4  JONES 2975 More_Salary
    5 MARTIN 1250 Less Salary
    6  BLAKE 2850 More_Salary
    7  CLARK 2450 More_Salary

     


    6. Python pandasql Package

    Case when 조건문을 사용하여서 직원 급여(‘sal’)가 1500 미만을 수령하면 ‘Less Salary’, 1500 이면 ‘Exact Salary, 1500 이상을 수령하면 ‘More Salary’를 출력한다.

     

    Python Programming
    import copy
    
    ps.sqldf(" select ename,sal,                              \
                    case when sal < 1500 then 'Less_Salary'   \
                         when sal = 1500 then 'Exact_Salary'  \
                         when sal > 1500 then 'More_Salary'   \
                    else 'Etc' end sal_grade                  \
              from emp ").head(7)

      ename sal sal_grade
    0 SMITH 800 Less_Salary
    1 ALLEN 1600 More_Salary
    2 WARD 1250 Less_Salary
    3 JONES 2975 More_Salary
    4 MARTIN 1250 Less_Salary
    5 BLAKE 2850 More_Salary
    6 CLARK 2450 More_Salary

     


    7. R data.table Package

    dplyr::case_when 조건문을 사용하여서 직원 급여(‘sal’)가 1500 미만을 수령하면 ‘Less Salary’, 1500 이면 ‘Exact Salary, 1500 이상을 수령하면 ‘More Salary’를 출력한다. 조건문은 급여를 사용자가 지정한 조건과 비교하여서 만족하는 경우 데이터를 변환하거나 특정 작업을 수행한다.

     

    R Programming
    %%R
    
    DT <- data.table(emp)
    
    DT[,sal_grade := dplyr::case_when(  sal <  1500 ~ "Less_Salary",
                                        sal == 1500 ~ "Exact_Salary",
                                        sal >  1500 ~ "More_Salary",
                                        TRUE ~ "ETC"
      )][1:7, ]

     

    Results
       empno  ename      job  mgr   hiredate  sal comm deptno   sal_grade
    1:  7369  SMITH    CLERK 7902 1980-12-17  800   NA     20 Less_Salary
    2:  7499  ALLEN SALESMAN 7698 1981-02-20 1600  300     30 More_Salary
    3:  7521   WARD SALESMAN 7698 1981-02-22 1250  500     30 Less_Salary
    4:  7566  JONES  MANAGER 7839 1981-04-02 2975   NA     20 More_Salary
    5:  7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400     30 Less_Salary
    6:  7698  BLAKE  MANAGER 7839 1981-03-01 2850   NA     30 More_Salary
    7:  7782  CLARK  MANAGER 7839 1981-01-09 2450   NA     10 More_Salary

     


    8. SAS Proc SQL

    Case when 조건문을 사용하여서 직원 급여(‘sal’)가 1500 미만을 수령하면 ‘Less Salary’, 1500 이면 ‘Exact Salary, 1500 이상을 수령하면 ‘More Salary’를 출력한다.

     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        select ename,sal,
               case when sal < 1500 then 'Less Salary'
                    when sal = 1500 then 'Exact Salary'
                    when sal > 1500 then 'More Salary'
               else 'ETC' end AS sal_grp
    from emp;
    QUIT;
    PROC PRINT data=STATSAS_1(obs=5);RUN;

     


    Results
    OBS ename sal sal_grp
    1 SMITH 800 Less Salary
    2 ALLEN 1600 More Salary
    3 WARD 1250 Less Salary
    4 JONES 2975 More Salary
    5 MARTIN 1250 Less Salary

     


    9. SAS Data Step

    IF 조건문을 사용하여서 직원 급여(‘sal’)가 1500 미만을 수령하면 ‘Less Salary’, 1500 이면 ‘Exact Salary, 1500 이상을 수령하면 ‘More Salary’를 출력한다.

     

    SAS Programming
    %%SAS sas
    
    DATA STATSAS_2;
     set emp;
         IF      sal < 1500 then sal_grp = 'Less Salary';
         ELSE IF sal = 1500 then sal_grp = 'Exact Salary';
         ELSE IF sal > 1500 then sal_grp = 'More Salary';
         else                    sal_grp = 'ETC';
    
         select;
           when (sal < 1500) sal_grp1 = 'Less Salary';
           when (sal = 1500) sal_grp1 = 'Exact Salary';
           when (sal > 1500) sal_grp1 = 'More Salary';
         otherwise sal_grp1 = 'ETC';
    end;
    
         KEEP EMPNO SAL sal_grp sal_grp1;
    RUN;
    PROC PRINT data=STATSAS_2(obs=5);RUN;

     


    Results
    OBS empno sal sal_grp sal_grp1
    1 7369 800 Less Salary Less Salary
    2 7499 1600 More Salary More Salary
    3 7521 1250 Less Salary Less Salary
    4 7566 2975 More Salary More Salary
    5 7654 1250 Less Salary Less Salary

     


    10. Python Dfply Package

     

    Python Programming
    def get_category(job):
        if   job < 1500   : cat = 'Less_Salary'
        elif job == 1500  : cat = 'Exact_Salary'
        elif job > 1500   : cat = 'More_Salary'
        else :              cat = 'Etc'
    
        return cat
    
    emp >> \
      select (X.empno,X.ename,X.sal) >> \
      mutate( salgrade_nm1 = make_symbolic(np.select)( [ X.sal <  1500, 
                                                         X.sal == 1500,
                                                         X.sal >  1500 ],
                                                       ['Less_Salary','Exact_Salary','More_Salary'] ),
              salgrade_nm2 = X.sal.apply(lambda x : get_category(x)),
              salgrade_nm3 = X.sal.apply(lambda x : 'Less_Salary' if x < 1500 
                                                                  else ('Exact_Salary' if x == 1500 
                                                                                       else ('More_Salary' if x > 1500 else 'ETC'))) ) >> \
      head()

     


    Results
      empno ename sal salgrade_nm1 salgrade_nm2 salgrade_nm3
    0 7369 SMITH 800 Less_Salary Less_Salary Less_Salary
    1 7499 ALLEN 1600 More_Salary More_Salary More_Salary
    2 7521 WARD 1250 Less_Salary Less_Salary Less_Salary
    3 7566 JONES 2975 More_Salary More_Salary More_Salary
    4 7654 MARTIN 1250 Less_Salary Less_Salary Less_Salary

     


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

    반응형

    댓글