포스팅 목차
125. Display those employees whose salary contains at least 4 digits?
* 급여가 4자리 이상의 급여를 수령하는 직원을 출력하시오.
- 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
- 유사문제 : 22/66 / 67 / 87 / 125번
- [문자 함수] 특정 문자열의 길이를 측정 - Length 함수
- 데이터 전처리 - SQL, Pandas, R Prog, Dplyr, Dfply, SQLDF, PANDASQL, DATA.TABLE, SAS, Proc Sql
|
1. Oracle(오라클)
length() 함수를 사용하여서 4자리 이상의 급여를 수령하는 직원을 출력한다.
Oracle Programming |
select *
from emp
where length(sal)>=4;
2. Python Pandas(파이썬)
급여의 자리수를 체크하기 위하여 급여를 문자로 변경후 len() 함수를 사용하여서 4자리 이상의 급여를 수령하는 직원을 출력한다.
- .astype(str) : int64를 문자로 변경
Python Programming |
emp[ emp['sal'].astype(str).str.len() >=4 ].head()
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
1 | 7499 | ALLEN | SALESMAN | 7698.0 | 1981/02/20 | 1600 | 300.0 | 30 |
2 | 7521 | WARD | SALESMAN | 7698.0 | 1981/02/22 | 1250 | 500.0 | 30 |
3 | 7566 | JONES | MANAGER | 7839.0 | 1981/04/02 | 2975 | NaN | 20 |
4 | 7654 | MARTIN | SALESMAN | 7698.0 | 1981/09/28 | 1250 | 1400.0 | 30 |
5 | 7698 | BLAKE | MANAGER | 7839.0 | 1981/03/01 | 2850 | NaN | 30 |
3. R Programming (R Package)
str_length() 함수를 사용하여서 4자리 이상의 급여를 수령하는 직원을 출력한다.
R Programming |
%%R
emp[ stringr::str_length(emp$sal) >= 4 , ] %>% head()
Results |
# A tibble: 6 x 8
empno ename job mgr hiredate sal comm deptno
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl>
1 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
2 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30
3 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20
4 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
5 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30
6 7782 CLARK MANAGER 7839 1981-01-09 2450 NA 10
4. R Dplyr Package
str_length() 함수를 사용하여서 4자리 이상의 급여를 수령하는 직원을 출력한다.
R Programming |
%%R
emp %>%
filter( stringr::str_length(sal) >= 4 ) %>%
head()
Results |
# A tibble: 6 x 8
empno ename job mgr hiredate sal comm deptno
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl>
1 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
2 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30
3 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20
4 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
5 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30
6 7782 CLARK MANAGER 7839 1981-01-09 2450 NA 10
5. R sqldf Package
length() 함수를 사용하여서 4자리 이상의 급여를 수령하는 직원을 출력한다. R의 sqldf에서 급여(‘sal’)가 real 형태로 처리되어서 길이가 6자리가 반환되어서 cast 함수를 사용하여서 정수로 변경 후 길이를 체크한다.
R Programming |
%%R
sqldf(" select empno,ename,
'x'||sal sal_x,
length(sal) sal_float_len,
typeof(sal) sal_float,
length(cast(sal as int)) sal_int_len,
typeof(cast(sal as int)) sal_int
from emp a
where length(cast(sal as int))>=4;")
Results |
empno ename sal_x sal_float_len sal_float sal_int_len sal_int
1 7499 ALLEN x1600.0 6 real 4 integer
2 7521 WARD x1250.0 6 real 4 integer
3 7566 JONES x2975.0 6 real 4 integer
4 7654 MARTIN x1250.0 6 real 4 integer
5 7698 BLAKE x2850.0 6 real 4 integer
6 7782 CLARK x2450.0 6 real 4 integer
7 7788 SCOTT x3000.0 6 real 4 integer
8 7839 KING x5000.0 6 real 4 integer
9 7844 TURNER x1500.0 6 real 4 integer
10 7876 ADAMS x1100.0 6 real 4 integer
11 7902 FORD x3000.0 6 real 4 integer
12 7934 MILLER x1300.0 6 real 4 integer
6. Python pandasql Package
length() 함수를 사용하여서 4자리 이상의 급여를 수령하는 직원을 출력한다.
Python Programming |
ps.sqldf(" select * from emp where length(sal)>=4;").head()
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
0 | 7499 | ALLEN | SALESMAN | 7698.0 | 1981/02/20 | 1600 | 300.0 | 30 |
1 | 7521 | WARD | SALESMAN | 7698.0 | 1981/02/22 | 1250 | 500.0 | 30 |
2 | 7566 | JONES | MANAGER | 7839.0 | 1981/04/02 | 2975 | NaN | 20 |
3 | 7654 | MARTIN | SALESMAN | 7698.0 | 1981/09/28 | 1250 | 1400.0 | 30 |
4 | 7698 | BLAKE | MANAGER | 7839.0 | 1981/03/01 | 2850 | NaN | 30 |
7. R data.table Package
str_length() 함수를 사용하여서 4자리 이상의 급여를 수령하는 직원을 출력한다.
R Programming |
%%R
DT <- data.table(emp)
dept_DT <- data.table(dept)
salgrade_DT <- data.table(salgrade)
DT[ stringr::str_length(sal) >= 4, ][1:5, ]
Results |
empno ename job mgr hiredate sal comm deptno
1: 7499 ALLEN SALESMAN 7698 1981-02-20 1600 300 30
2: 7521 WARD SALESMAN 7698 1981-02-22 1250 500 30
3: 7566 JONES MANAGER 7839 1981-04-02 2975 NA 20
4: 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
5: 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30
8. SAS Proc SQL
length() 함수를 사용하여서 4자리 이상의 급여를 수령하는 직원을 출력한다.
LENGTH 함수와 PRXMATCH 함수는 문자에만 지원 함.(자동형 변환 지원 안함.);
SAS Programming |
%%SAS sas
PROC SQL;
CREATE TABLE STATSAS_1 AS
select A.*,
length(COMPRESS( PUT(sal,8.) )) AS SAL_LEN
from emp A
where length(COMPRESS( PUT(sal,8.) )) >= 4;
QUIT;
PROC PRINT data=STATSAS_1(obs=5);RUN;
Results |
OBS | empno | ename | job | mgr | hiredate | sal | comm | deptno | SAL_LEN |
1 | 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 | 4 |
2 | 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 | 4 |
3 | 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | . | 20 | 4 |
4 | 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 | 30 | 4 |
5 | 7698 | BLAKE | MANAGER | 7839 | 1981-03-01 | 2850 | . | 30 | 4 |
SAS Programming |
%%SAS sas
PROC SQL;
CREATE TABLE STATSAS_2 AS
select *
from emp
where COMPRESS( PUT(sal,8.) ) LIKE '____%';
QUIT;
PROC PRINT data=STATSAS_2(obs=5);RUN;
Results |
OBS | empno | ename | job | mgr | hiredate | sal | comm | deptno |
1 | 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 |
2 | 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 |
3 | 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975 | . | 20 |
4 | 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 | 30 |
5 | 7698 | BLAKE | MANAGER | 7839 | 1981-03-01 | 2850 | . | 30 |
- 숫자가 4자리 이상인 경우 체크;
- 현재 SASPy에서 출력 문제 있음;
SAS Programming |
%%SAS sas
PROC SQL;
CREATE TABLE STATSAS_3 AS
select a.*,
prxmatch('/(\d{4})+/', COMPRESS( PUT(SAL,8.) ) ) as sal_chk
from emp a
WHERE prxmatch('/(\d{4})+/', COMPRESS( PUT(SAL,8.) ) ) >= 4;
QUIT;
9. SAS Data Step
SAS Programming |
%%SAS sas
DATA STATSAS_4;
SET EMP;
SAL_LEN = length(COMPRESS( PUT(sal,8.) ));
Drop job hiredate comm;
where length(COMPRESS( PUT(sal,8.) )) >= 4;
RUN;
PROC PRINT data=STATSAS_4(obs=5);RUN;
Results |
OBS | empno | ename | mgr | sal | deptno | SAL_LEN |
1 | 7499 | ALLEN | 7698 | 1600 | 30 | 4 |
2 | 7521 | WARD | 7698 | 1250 | 30 | 4 |
3 | 7566 | JONES | 7839 | 2975 | 20 | 4 |
4 | 7654 | MARTIN | 7698 | 1250 | 30 | 4 |
5 | 7698 | BLAKE | 7839 | 2850 | 30 | 4 |
SAS Programming |
%%SAS sas
DATA STATSAS_5;
SET EMP;
SAL_LEN = length(COMPRESS( PUT(sal,8.) ));
Drop job hiredate comm;
where COMPRESS( PUT(sal,8.) ) LIKE '____%';
RUN;
PROC PRINT data=STATSAS_5(obs=5);RUN;
Results |
OBS | empno | ename | mgr | sal | deptno | SAL_LEN |
1 | 7499 | ALLEN | 7698 | 1600 | 30 | 4 |
2 | 7521 | WARD | 7698 | 1250 | 30 | 4 |
3 | 7566 | JONES | 7839 | 2975 | 20 | 4 |
4 | 7654 | MARTIN | 7698 | 1250 | 30 | 4 |
5 | 7698 | BLAKE | 7839 | 2850 | 30 | 4 |
SAS Programming |
%%SAS sas
* 4자리 연속된 숫자 존재여부 체크;
DATA STATSAS_6;
SET EMP;
sal_chk = prxmatch('/(\d{4})+/', COMPRESS( PUT(SAL,8.) ) );
Drop job hiredate comm;
where prxmatch('/(\d{4})+/', COMPRESS( PUT(SAL,8.) ) ) >= 1;
RUN;
PROC PRINT data=STATSAS_6(obs=5);RUN;
Results |
empno | ename | mgr | sal | deptno | sal_chk | |
1 | 7499 | ALLEN | 7698 | 1600 | 30 | 1 |
2 | 7521 | WARD | 7698 | 1250 | 30 | 1 |
3 | 7566 | JONES | 7839 | 2975 | 20 | 1 |
4 | 7654 | MARTIN | 7698 | 1250 | 30 | 1 |
5 | 7698 | BLAKE | 7839 | 2850 | 30 | 1 |
10. Python Dfply Package
Python Programming |
emp >> filter_by(X.sal.astype(str).str.len() >=4) >> \
head()
Results |
empno | ename | job | mgr | hiredate | sal | comm | deptno | |
1 | 7499 | ALLEN | SALESMAN | 7698.0 | 1981/02/20 | 1600 | 300.0 | 30 |
2 | 7521 | WARD | SALESMAN | 7698.0 | 1981/02/22 | 1250 | 500.0 | 30 |
3 | 7566 | JONES | MANAGER | 7839.0 | 1981/04/02 | 2975 | NaN | 20 |
4 | 7654 | MARTIN | SALESMAN | 7698.0 | 1981/09/28 | 1250 | 1400.0 | 30 |
5 | 7698 | BLAKE | MANAGER | 7839.0 | 1981/03/01 | 2850 | NaN | 30 |
[SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 전처리 방법 리스트
반응형
댓글