포스팅 목차
127. Display those employees whose name contains “A”?
* 이름에 영문자 “A”가 포함된 직원들의 정보를 출력하시오.
- 파이썬 & R 패키지 호출 및 예제 데이터 생성 링크
- 유사문제 : 19~21번
- [문자 함수] 문자열에서 문자 검색 - 문자 검색 함수(Instr 함수)
- 데이터 전처리 - SQL, Pandas, R Prog, Dplyr, Dfply, SQLDF, PANDASQL, DATA.TABLE, SAS, Proc Sql
|
1. Oracle(오라클)
instr 함수를 사용하여서 사원명(‘ename’)의 첫 번째 문자에서 검색을 시작하여서 대문자 ‘A’가 첫 번째로 검색되는 위치를 확인 한 후 0 보다 큰(검색된 경우) 경우에 해당하는 직원들의 정보를 출력한다.
Oracle Programming |
select *
from emp
where instr(ename,'A',1,1)>0;
like 함수를 사용하여서 사원명(‘ename’)에 대문자 ‘A’가 존재하는 직원들을 선택하여서 출력한다.
Oracle Programming |
select *
from emp
where ename like ('%A%')
2. Python Pandas(파이썬)
contains 함수를 사용하여서 사원명(‘ename’)에 대문자 ‘A’가 존재하는 직원들을 선택하여서 출력한다.
Python Programming |
emp[ emp['ename'].str.contains("A") ].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 |
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 |
6 | 7782 | CLARK | MANAGER | 7839.0 | 1981/01/09 | 2450 | NaN | 10 |
3. R Programming (R Package)
%like% 함수를 사용하여서 사원명(‘ename’)에 대문자 ‘A’가 존재하는 직원들을 선택하여서 출력한다.
R Programming |
%%R
emp[ emp$ename %like% 'A' ,]
Results |
# A tibble: 4 x 8
empno ename job mgr hiredate sal comm deptno
<dbl> <chr> <chr> <dbl> <date> <dbl> <dbl> <dbl>
1 7369 SMITH CLERK 7902 1980-12-17 800 NA 20
2 7788 SCOTT ANALYST 7566 1982-12-09 3000 NA 20
3 7900 JAMES CLERK 7698 1981-12-03 950 NA 30
4 7902 FORD ANALYST 7566 1981-12-03 3000 NA 20
4. R Dplyr Package
%like% 함수를 사용하여서 사원명(‘ename’)에 대문자 ‘A’가 존재하는 직원들을 선택하여서 출력한다.
R Programming |
%%R
emp %>% filter( ename %like% "A" )
Results |
# A tibble: 7 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 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
4 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30
5 7782 CLARK MANAGER 7839 1981-01-09 2450 NA 10
6 7876 ADAMS CLERK 7788 1983-01-12 1100 NA 20
7 7900 JAMES CLERK 7698 1981-12-03 950 NA 30
5. R sqldf Package
like 함수를 사용하여서 사원명(‘ename’)에 대문자 ‘A’를 포함하고 있는 직원들의 정보를 출력한다.
R Programming |
%%R
sqldf(" select *
from emp
where ename like ('%A%'); ")
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 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
4 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30
5 7782 CLARK MANAGER 7839 1981-01-09 2450 NA 10
6 7876 ADAMS CLERK 7788 1983-01-12 1100 NA 20
7 7900 JAMES CLERK 7698 1981-12-03 950 NA 30
instr 함수를 사용하여서 사원명(‘ename’)의 첫 번째 문자에서 검색을 시작하여서 대문자 ‘A’가 첫 번째로 검색되는 위치를 확인 한 후 0 보다 큰(검색된 경우) 경우에 해당하는 직원들의 정보를 출력한다.
R Programming |
%%R
sqldf(" select *
from emp
where instr(ename,'A') > 0 ")
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 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
4 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30
5 7782 CLARK MANAGER 7839 1981-01-09 2450 NA 10
6 7876 ADAMS CLERK 7788 1983-01-12 1100 NA 20
7 7900 JAMES CLERK 7698 1981-12-03 950 NA 30
6. Python pandasql Package
Python Programming |
ps.sqldf(" select * from emp where ename like ('%A%'); ").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 | 7654 | MARTIN | SALESMAN | 7698.0 | 1981/09/28 | 1250 | 1400.0 | 30 |
3 | 7698 | BLAKE | MANAGER | 7839.0 | 1981/03/01 | 2850 | NaN | 30 |
4 | 7782 | CLARK | MANAGER | 7839.0 | 1981/01/09 | 2450 | NaN | 10 |
Python Programming |
ps.sqldf(" select * from emp where instr(ename,'A')>0 ").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 | 7654 | MARTIN | SALESMAN | 7698.0 | 1981/09/28 | 1250 | 1400.0 | 30 |
3 | 7698 | BLAKE | MANAGER | 7839.0 | 1981/03/01 | 2850 | NaN | 30 |
4 | 7782 | CLARK | MANAGER | 7839.0 | 1981/01/09 | 2450 | NaN | 10 |
7. R data.table Package
%like% 함수를 사용하여서 사원명(‘ename’)에 대문자 ‘A’가 존재하는 직원들을 선택하여서 출력한다.
R Programming |
%%R
DT <- data.table(emp)
DT[ ename %like% "A", ]
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: 7654 MARTIN SALESMAN 7698 1981-09-28 1250 1400 30
4: 7698 BLAKE MANAGER 7839 1981-03-01 2850 NA 30
5: 7782 CLARK MANAGER 7839 1981-01-09 2450 NA 10
6: 7876 ADAMS CLERK 7788 1983-01-12 1100 NA 20
7: 7900 JAMES CLERK 7698 1981-12-03 950 NA 30
8. SAS Proc SQL
- Index 함수와 Find 함수
SAS Programming |
%%SAS sas
PROC SQL;
CREATE TABLE STATSAS_1 AS
select a.*,
index(ename,'A') as index_A,
find(ename,'A',3) as index_A_2
from emp a
where index(ename,'A')>0;
QUIT;
PROC PRINT Data=STATSAS_1(Drop=job hiredate comm);RUN;
Results |
OBS | empno | ename | mgr | sal | deptno | index_A | index_A_2 |
1 | 7499 | ALLEN | 7698 | 1600 | 30 | 1 | 0 |
2 | 7521 | WARD | 7698 | 1250 | 30 | 2 | 0 |
3 | 7654 | MARTIN | 7698 | 1250 | 30 | 2 | 0 |
4 | 7698 | BLAKE | 7839 | 2850 | 30 | 3 | 3 |
5 | 7782 | CLARK | 7839 | 2450 | 10 | 3 | 3 |
6 | 7876 | ADAMS | 7788 | 1100 | 20 | 1 | 3 |
7 | 7900 | JAMES | 7698 | 950 | 30 | 2 | 0 |
- [참고] Scan 함수
SAS Programming |
%%SAS sas
PROC SQL;
CREATE TABLE STATSAS_1 AS
select a.*,
scan(ename, 1,'A') as fir,
scan(ename, 2,'A') as sec,
scan(ename, 3,'A') as thr
from emp a
where index(ename,'A') > 0;
QUIT;
PROC PRINT;RUN;
Results |
OBS | empno | ename | job | mgr | hiredate | sal | comm | deptno | fir | sec | thr |
1 | 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600 | 300 | 30 | LLEN | ||
2 | 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250 | 500 | 30 | W | RD | |
3 | 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 | 30 | M | RTIN | |
4 | 7698 | BLAKE | MANAGER | 7839 | 1981-03-01 | 2850 | . | 30 | BL | KE | |
5 | 7782 | CLARK | MANAGER | 7839 | 1981-01-09 | 2450 | . | 10 | CL | RK | |
6 | 7876 | ADAMS | CLERK | 7788 | 1983-01-12 | 1100 | . | 20 | D | MS | |
7 | 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950 | . | 30 | J | MES |
9. SAS Data Step
SAS Programming |
%%SAS sas
DATA STATSAS_3;
SET EMP;
index_A = index(ename,'A');
index_A_2 = find(ename,'A',3); /* 3번째 자리 이후 */
Drop job hiredate comm;
where index(ename,'A')>0;
RUN;
PROC PRINT;RUN;
Results |
OBS | empno | ename | mgr | sal | deptno | index_A | index_A_2 |
1 | 7499 | ALLEN | 7698 | 1600 | 30 | 1 | 0 |
2 | 7521 | WARD | 7698 | 1250 | 30 | 2 | 0 |
3 | 7654 | MARTIN | 7698 | 1250 | 30 | 2 | 0 |
4 | 7698 | BLAKE | 7839 | 2850 | 30 | 3 | 3 |
5 | 7782 | CLARK | 7839 | 2450 | 10 | 3 | 3 |
6 | 7876 | ADAMS | 7788 | 1100 | 20 | 1 | 3 |
7 | 7900 | JAMES | 7698 | 950 | 30 | 2 | 0 |
10. Python Dfply Package
Python Programming |
emp >> filter_by( X.ename.str.contains("A") )
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 |
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 |
6 | 7782 | CLARK | MANAGER | 7839.0 | 1981/01/09 | 2450 | NaN | 10 |
10 | 7876 | ADAMS | CLERK | 7788.0 | 1983/01/12 | 1100 | NaN | 20 |
11 | 7900 | JAMES | CLERK | 7698.0 | 1981/12/03 | 950 | NaN | 30 |
[SQL, Pandas, R Prog, Dplyr, SQLDF, PANDASQL, DATA.TABLE] SQL EMP 예제로 만나는 테이블 데이터 전처리 방법 리스트
댓글