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

[데이터 필터링 - 접두어 Like 검색] 테이블 데이터 전처리 비교 - 19 (오라클 SQL, R, Python, SAS)

by 기서무나구물 2021. 8. 6.

포스팅 목차

     

    19. Display the names of employees whose name starts with alphabet S.

     

    *이름이 알파벳 'S'로 시작하는 직원의 이름을 출력하시오.


    • Oracle : like, substr 함수
    • 파이썬 Pandas : str.startswith(), str.endswith(), str.contains() 함수, .query() 구문
    • R 프로그래밍 : startsWith(), subset() 구문
    • R Dplyr Package : startsWith(), filter() 구문, str_detect() 함수, grepl() 문자열 함수, filter_all, any_vars, str_detect() 함수
    • R sqldf Package : like 연산자
    • Python pandasql Package : like 연산자
    • R data.table Package : %like% 연산자, grepl() 함수
    • SAS Proc SQL : like 연산자, substr 함수
    • SAS Data Step : like 연산자, substr 함수
    • Python Dfply Package : filter_by() 구문, mask() 구문, startswith() 함수,
    • 파이썬 Base 프로그래밍 :

     


    1. 오라클(Oracle)

    Like 연산자를 사용하여서 사원명(ename) 변수에서 사원 이름이 S로 시작하는 관측치를 선택한다.

     

    Oracle Programming
    select ename from emp 
    where  ename like 'S%';

     


     

    Oracle Programming
    select ename from emp 
    where  substr(ename,1,1) = 'S';

     


    2. 파이썬(Pandas)

    • SQL - WHERE column_name LIKE 's%'
    • Python - column_name.str.startswith('s')
    • SQL - WHERE column_name LIKE '%s'
    • Python - column_name.str.endswith('s')
    • SQL - WHERE column_name LIKE '%s%'
    • Python - column_name.str.contains('s')
    • startswith 함수를 사용하여서 사원이름이 "S"로 시작하는 사원을 선택.
    Python Programming
    emp[ emp['ename'].str.startswith("S") ]

     

    Results
      empno ename job mgr hiredate sal comm deptno hiredate_D
    0 7369 SMITH CLERK 7902.0 1980/12/17 800 NaN 20 1980-12-17
    7 7788 SCOTT ANALYST 7566.0 1982/12/09 3000 NaN 20 1982-12-09

     


     

    Python Programming
    emp.loc[(emp.ename.str.startswith("S")) , ["ename"]]

     

    Results
      ename
    0 SMITH
    7 SCOTT

     


    • query구문과 endswith 함수를 사용하여서 사원이름이 "S"로 시작하는 사원을 선택.
    • pandas query 에러 발생(TypeError: 'Series' objects are mutable, thus they cannot be hashed)
    • 조치사항 : using python engine instead of numexpr engine
    Python Programming
    emp.query('ename.str.startswith("S")', engine='python')[['ename']]

     

    Results
      ename
    0 SMITH
    7 SCOTT

     


    3. R Programming (R Package)

    startsWith 함수를 사용하여서 ename 변수에서 S로 시작하는 관측치 선택한다.

     

    R Programming
    %%R
    emp[ (startsWith(emp$ename, "S"))  , c("ename") ]

     

    Results
    # A tibble: 2 x 1
      ename
      <chr>
    1 SMITH
    2 SCOTT

     


     

    R Programming
    %%R
    
    emp[which(startsWith(emp$ename, "S")), c("ename") ] %>% as.data.frame()

     

    Results
      ename
    1 SMITH
    2 SCOTT

     


    subset구문에서 startsWith 함수를 사용하여서 ename 변수에서 S로 시작하는 관측치를 선택한다.

     

    R Programming
    %%R
    subset(emp,subset= (startsWith(ename, "S")) , select=c(empno,ename) )

     

    Results
    # A tibble: 2 x 2
      empno ename
      <dbl> <chr>
    1  7369 SMITH
    2  7788 SCOTT

     


    4. R Dplyr Package

    startsWith 함수를 사용하여서 ename 변수에서 사원이름이 S로 시작하는 관측치 선택

     

    R Programming
    %%R
    
    emp %>% filter( startsWith(ename, "S") ) %>% select(ename)

     

    Results
    # A tibble: 2 x 1
      ename
      <chr>
    1 SMITH
    2 SCOTT

     


    stringr 패키지의 str_detect 패턴 매칭 함수를 사용하여서 ename 변수에서 사원이름이 S로 시작하는 관측치를 선택한다.

    • ^는 문장의 맨 처음을 의미
    R Programming
    %%R
    
    emp %>% filter( str_detect(ename,"^S") ) %>% select(ename)

     

    Results
    # A tibble: 2 x 1
      ename
      <chr>
    1 SMITH
    2 SCOTT

     


    기본 함수 grepl 패턴 매칭 함수를 사용하여서 ename 변수에서 사원이름이 S로 시작하는 관측치를 선택한다.

     

    R Programming
    %%R
    
    emp %>% filter( grepl("^S", ename) ) %>% select(ename)

     

    Results
    # A tibble: 2 x 1
      ename
      <chr>
    1 SMITH
    2 SCOTT

     


     

    R Programming
    %%R
    
    emp %>% filter( grepl("D", ename) ) %>% select(ename)

     


    • [참고] 모든 변수의 값 중에서 "C" 나 "A" 로 시작되는 값 선택

     

    R Programming
    %%R
    
    emp %>% filter_all(any_vars(str_detect(., "^(C|A)")))

     

    Results
    # A tibble: 8 x 10
      empno ename job     mgr hiredate     sal  comm deptno Tot_salary annualsal$sal
      <dbl> <chr> <chr> <dbl> <date>     <dbl> <dbl>  <dbl>      <dbl>         <dbl>
    1  7369 SMITH CLERK  7902 1980-12-17   800    NA     20         NA          9600
    2  7499 ALLEN SALE~  7698 1981-02-20  1600   300     30     480000         19500
    3  7782 CLARK MANA~  7839 1981-01-09  2450    NA     10         NA         29400
    4  7788 SCOTT ANAL~  7566 1982-12-09  3000    NA     20         NA         36000
    5  7876 ADAMS CLERK  7788 1983-01-12  1100    NA     20         NA         13200
    6  7900 JAMES CLERK  7698 1981-12-03   950    NA     30         NA         11400
    7  7902 FORD  ANAL~  7566 1981-12-03  3000    NA     20         NA         36000
    8  7934 MILL~ CLERK  7782 1982-01-23  1300    NA     10         NA         15600

     


    • data.table 의 %like% 를 사용

     

    R Programming
    %%R
    
    library(data.table) 
    
    emp %>% filter( ename %like% "^S" ) %>% dplyr::select(ename)

     

    Results
    # A tibble: 2 x 1
      ename
      <chr>
    1 SMITH
    2 SCOTT

     


    5. R sqldf Package

    Like 연산자를 사용하여서 사원명(ename) 변수에서 사원 이름이 S로 시작하는 관측치를 선택한다.

     

    R Programming
    %%R
    
    sqldf("select ename from emp where ename like 'S%'")

     

    Results
      ename
    1 SMITH
    2 SCOTT

     


    6. Python pandasql Package

    Like 연산자를 사용하여서 사원명(ename) 변수에서 사원 이름이 S로 시작하는 관측치를 선택한다.

     

    Python Programming
    ps.sqldf("select ename from emp where ename like 'S%'")

     

    Results
      ename
    0 SMITH
    1 SCOTT

     


    7. R data.table Package

     

    R Programming
    %%R
    
    DT          <- data.table(emp)
    dept_DT     <- data.table(dept)
    
    DT[ ename %like% "^S" , .(ename)]

     

    Results
       ename
    1: SMITH
    2: SCOTT

     


     

    R Programming
    %%R
    
    DT[grepl("^S", ename), .(ename)]

     

    Results
       ename
    1: SMITH
    2: SCOTT

     


    8. SAS Proc SQL

    Like 연산자를 사용하여서 사원명(ename) 변수에서 사원 이름이 S로 시작하는 관측치를 선택한다.

     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        SELECT A.*
        FROM   EMP A
        where ename like 'S%';
    QUIT;
    PROC PRINT;RUN;

     

    Results
    OBS empno ename job mgr hiredate sal comm deptno
    1 7369 SMITH CLERK 7902 1980-12-17 800 . 20
    2 7788 SCOTT ANALYST 7566 1982-12-09 3000 . 20

     


     

    SAS Programming
    %%SAS sas
    
    PROC SQL;
      CREATE TABLE STATSAS_1 AS
        SELECT A.*
        FROM   EMP A
        where  substr(ename,1,1) = 'S';
    QUIT;
    PROC PRINT;RUN;

     

    Results
    OBS empno ename job mgr hiredate sal comm deptno
    1 7369 SMITH CLERK 7902 1980-12-17 800 . 20
    2 7788 SCOTT ANALYST 7566 1982-12-09 3000 . 20

     


    9. SAS Data Step

    Like 연산자를 사용하여서 사원명(ename) 변수에서 사원 이름이 S로 시작하는 관측치를 선택한다.

     

    SAS Programming
    %%SAS sas
    
    DATA STATSAS_2;
     SET EMP;
         where ename like 'S%';
    RUN;
    PROC PRINT;RUN;

     

    Results
    OBS empno ename job mgr hiredate sal comm deptno
    1 7369 SMITH CLERK 7902 1980-12-17 800 . 20
    2 7788 SCOTT ANALYST 7566 1982-12-09 3000 . 20

     


     

    SAS Programming
    %%SAS sas
    
    DATA STATSAS_2;
     SET EMP;
         where substr(ename,1,1) = 'S';
    RUN;
    PROC PRINT;RUN;

     

    Results
    OBS empno ename job mgr hiredate sal comm deptno
    1 7369 SMITH CLERK 7902 1980-12-17 800 . 20
    2 7788 SCOTT ANALYST 7566 1982-12-09 3000 . 20

     


    10. Python Dfply Package

     

    Python Programming
    emp >> filter_by(X.ename.str.startswith("S"))

     

    Results
      empno ename job mgr hiredate sal comm deptno
    0 7369 SMITH CLERK 7902.0 1980/12/17 800 NaN 20
    7 7788 SCOTT ANALYST 7566.0 1982/12/09 3000 NaN 20

     


     

    Python Programming
    emp >> mask(X.ename.str.startswith("S"))

     

    Results
      empno ename job mgr hiredate sal comm deptno
    0 7369 SMITH CLERK 7902.0 1980/12/17 800 NaN 20
    7 7788 SCOTT ANALYST 7566.0 1982/12/09 3000 NaN 20

     


     

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

     

    반응형

    댓글