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

[문자 함수] 특정 문자열의 길이를 측정 - Length 함수 - 125 (오라클 SQL, R, Python, SAS)

by 기서무나구물 2022. 12. 14.

포스팅 목차

    125. Display those employees whose salary contains at least 4 digits?

     

    * 급여가 4자리 이상의 급여를 수령하는 직원을 출력하시오.

     


    • Oracle : Length()
    • 파이썬 Pandas : .str.len(), .astype(str)
    • R 프로그래밍 : stringr::str_length()
    • R Dplyr Package : stringr::str_length()
    • R sqldf Package : Length(), typeof() 변수 타입 확인, cast() 변수 타입 변환
    • Python pandasql Package : Length()
    • R data.table Package : stringr::str_length()
    • SAS Proc SQL : Length(), COMPRESS(), PUT() 변수 타입 변환(수치형을 수치형태의 문자로 변환), LIKE 연산자, prxmatch() 정규식 함수
    • SAS Data Step : Length(), COMPRESS(), PUT() 변수 타입 변환(수치형을 수치형태의 문자로 변환), LIKE 연산자, prxmatch() 정규식 함수
    • Python Dfply Package : .str.len(), .astype(str)
    • 파이썬 Base 프로그래밍 :

     


    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 예제로 만나는 테이블 데이터 전처리 방법 리스트

    반응형

    댓글