포스팅 목차
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’를 출력하시오.
- 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
- 조건문(Case when) : 73
- [데이터 추출] 조건에 따라 값을 변경 - Case When 조건문
- 데이터 전처리 (SQL, Pandas, R Prog, Dplyr, Dfply, SQLDF, PANDASQL, DATA.TABLE, SAS, Proc Sql)
|
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 예제로 만나는 테이블 데이터 전처리 방법 리스트
'통계프로그램 비교 시리즈 > 프로그래밍비교(Oracle,Python,R,SAS)' 카테고리의 다른 글
[문자함수와 조건문] 조건에 따라 값을 변경 - 147 (오라클 SQL, R, Python, SAS) (0) | 2023.01.02 |
---|---|
[날짜 데이터] 날짜 기간 차이 계산 - 현재 날짜 - 146 (오라클 SQL, R, Python, SAS) (0) | 2023.01.02 |
[날짜 포맷] 날짜 출력 포맷 지정 - 144 (오라클 SQL, R, Python, SAS) (1) | 2023.01.01 |
[문자 함수] 문자열 결합 함수 - 143 (오라클 SQL, R, Python, SAS) (0) | 2022.12.31 |
[문자 함수와 수치형 함수] 문자 결합 함수와 반올림 함수 - 달러('$') 출력 - 142 (오라클 SQL, R, Python, SAS) (0) | 2022.12.28 |
댓글