본문 바로가기

R

SQL과 R과 비교(함수)

728x90
반응형

R에서의 함수

1. 문자함수

2. 숫자 함수

3. 날짜 함수

4. 변환함수

5. 일반 함수



문자함수

 

SQL

VS

R

 

upper

 

toupper

 

lower

 

tolower

 

substr

 

substr

 

replace

 

gsub

 

months_between=function (last,first){

  #

  x=12*(as.integer(format(last,'%Y'))-as.integer(format(as.Date(first),'%Y')))

 

  #

  y=as.integer(format(last,'%m'))-as.integer(format(as.Date(first),'%m'))

 

  #

  if (as.integer(format(last,'%d'))<as.integer(format(as.Date(first),'%d')) ) z=-1

  else z=0

  print(x+y+z)

}

 

 

 

 

문제23. 이름과 직업을 출력하는데 소문자로 출력하시오

library(data.table)

data.table(이름=tolower(emp$ename), 직업=tolower(emp$job))

      이름      직업
 1:  smith     clerk
 2:  allen  salesman
 3:   ward  salesman
 4:  jones   manager
 5: martin  salesman
 6:  blake   manager
 7:  clark   manager
 8:  scott   analyst
 9:   king president
10: turner  salesman
11:  adams     clerk
12:  james     clerk
13:   ford   analyst
14: miller     clerk
15:   jack     clerk

 

 

데이터 테이블 사용안하고 하는 방법

cbind  (* sql 유니온과 같은 역할)

cbind(tolower(emp$ename), tolower(emp$job))

 

 

 

 

문제24. (R 함수 생성) 아래와 같이 이름을 물어보게 하고

이름을 입력하면 해당 사원의 이름,월급이 출력되는

R코드를 작성하시오

 

find_sal <- function() {

              response <- readline(prompt = 'put in name')

              x <- emp[emp$ename==resposnse, c("ename","sal")]

              print(x)

                      }

 

설명:

find_sal 함수 이름

선언 function()

그리고 중괄호 열기 { 

response  <-  readline 파이썬의 input

x <- emp[ 조건 ==(위에적은)response, 나머지 똑같이 combine]

print(x) 까지. (<-이게 리턴)

끝으로 중괄호 닫기 }

 

 

 

 

 

문제25. 위의 문제를 다시 해결하는데 이름을 소문자로 입력해도

출력되게 하시오

 

find_sal <- function() {

              response <- readline(prompt = 'put in name')

              x <- emp[emp$ename==toupper(resposnse), c("ename","sal")]

              print(x)

}

find_sal()

 

 

 

문제26. (substr 함수) 이름의 두번째 철자가 M 사원들의 이름,월급을

출력하는데 substr 함수를 사용해서 출력하시오

 

emp[substr(emp$ename, 2,2) =='M', c('ename','sal') ]

                                                      

 

설명: substr(x, start, stop)

   substr(emp$ename,2,2)     S  M  I   T  H

이름의 두번째 자리부터       1   2  3  4   5

두번째 자리까지

 

 

 

 

 

문제27. substr 함수를 이용해서 이름, 이름의 앞부터 철자3개까지인

두개의 이름 컬럼을 출력하시오

data.table(이름=emp$ename, 이름=substr(ename,1,3))

이름 이름
 1:  SMITH  SMI
 2:  ALLEN  ALL
 3:   WARD  WAR
 4:  JONES  JON
 5: MARTIN  MAR
 6:  BLAKE  BLA
 7:  CLARK  CLA
 8:  SCOTT  SCO
 9:   KING  KIN
10: TURNER  TUR
11:  ADAMS  ADA
12:  JAMES  JAM
13:   FORD  FOR
14: MILLER  MIL
15:   JACK  JAC

 

 

 

 

gsub

설명: gsub('h', 'H', text)

특정 text에서 소문자 h 대문자 H 변경해라

최종적으로 뽑고자 하는 값은 대문자H

(오라클의 replace)

 

 

문제28. 이름,월급을 출력하는데 월급을 출력할 때에 숫자 0

* 출력하시오

 

emp[gsub('0','*',sal ),c('ename','sal')]

 

data.table(emp$ename, gsub(0,'*',sal))

*0 굳이 문자처리 안해줘도

 

 

 

문제29. 이름,월급을 출력하는데 월급을 출력할 때에

숫자 0,1,2 * 출력하시오

data.table(ename, sal, gsub('[0-2]','*',sal))

*범위지정은 문자화해야함(프로그램 형식)

 

 

 

사이트는

cifar10 으로 훈련시킨것으로, 사진넣으면 맞춘다 !

https://aidencahn.shinyapps.io/cifar10_densenet/

 

 

 

 

 

숫자 함수

 

SQL

vs

R

1.

round

 

round

2.

trunc

 

trunc

3.

mod

 

%%

4.

power

 

^(: 2^3)

 

 

 

문제30. 6 9승을 출력하시오

6^9
[1] 10077696

 

문제31. 10 3으로 나눈 나머지값이 무엇인가?

 10%%3
[1] 1

 

 

 

문제32. 이름,연봉을 출력하는데 연봉은 월급에 12 곱해서

출력하고 컬럼명을 한글로 연봉으로 출력되게 하시오

data.table(ENAME=ename, SALARY=sal*12)

 

 

 

문제33. 이름,연봉을 출력하는데 연봉이 높은것부터 출력하시오

 

orderBy(~-SAL, data.table(ENAME=ename, SAL=sal*12) )

 

 

 

 

문제34. 위의 결과를 다시 출력하는데 round 함수를 이용해서

아래와 같이 백단위에서 반올림되게 하시오

 

4: JONES 35700 ------> 360000

 

orderBy(~-SAL, data.table(ENAME=ename, SAL=round(sal*12 , -3) ) )

설명:

-3

예를들어 3  5  7  0  0

    -5 -4 -3 -2 -1

해당 자릿수에서 반올림시킨다

 

orderBy(~-SAL, data.table(ENAME=ename, S=sal*12,SAL=round(sal*12 , -3) ) )
     ENAME     S   SAL
 1:   KING 60000 60000
 2:   JACK 38400 38000
 3:  JONES 35700 36000
 4:  SCOTT 36000 36000
 5:   FORD 36000 36000
 6:  BLAKE 34200 34000
 7:  CLARK 29400 29000
 8:  ALLEN 19200 19000
 9: TURNER 18000 18000
10: MILLER 15600 16000
11:   WARD 15000 15000
12: MARTIN 15000 15000
13:  ADAMS 13200 13000
14:  JAMES 11400 11000
15:  SMITH  9600 10000

 

 

R round 특징

round(122.5)
[1] 122
> round(123.5)
[1] 124

 

R 짝수를 좋아한다.

R뿐만 아니라 파이썬도 그렇다.

 

 

 

문제35. 문제34 결과를 다시 출력하는데 백자리를 포함해서

이후를 버려서 출력하시오

 

orderBy(~-SAL, data.table(ENAME=ename, S=sal*12,SAL=trunc(sal*12 , -3) ) )

 

에러는 안뜨는데 안된다.

설명:

왜냐하면 trunc 소수점 이후만 가능하다.

 

3   5   6   .   5   6   7

-3 -2  -1  0  1   2   3

 

 

 

 

날짜 함수

 

 

오라클

vs

R

1.

sysdate

 

Sys.Date()

2.

months_between

 

사용자 정의 함수

3.

last_day

 

사용자 정의 함수

4.

next_day

 

사용자 정의 함수

 

 

 

문제36. 오늘날짜를 출력하시오

Sys.Date()
[1] "2019-02-14"

 

 

 

문제37. 이름,입사한 날짜부터 오늘까지 몇일 근무했는지 출력하시오

 

emp hiredate 날짜가 아니라 factor .

 

날짜로 변환하는 함수?

오라클

VS

R

to_date()

 

as.Date()

data.table(ENAME=ename, DATES=Sys.Date()-as.Date(hiredate))
     ENAME      DATES
 1:  SMITH 13938 days
 2:  ALLEN 13873 days
 3:   WARD 13871 days
 4:  JONES 13832 days
 5: MARTIN 13653 days
 6:  BLAKE 13803 days
 7:  CLARK 13764 days
 8:  SCOTT 11624 days
 9:   KING 13603 days
10: TURNER 13673 days
11:  ADAMS 11590 days
12:  JAMES 13587 days
13:   FORD 13587 days
14: MILLER 13536 days
15:   JACK 13536 days

 

 

 

 

문제38. 오늘날짜의 달의 마지막 날짜를 출력하시오

SQL> select last_day(sysdate) from dual;

 

install.packages("lubridate")

library(lubridate)

 

 last_day <- function(x){
+   ceiling_date(x, "month")- days(1)
+ }
> last_day(Sys.Date())
[1] "2019-02-28"

 

 

> ceiling_date(Sys.Date(), "month")
[1] "2019-03-01"

 

*ceiling_date 해당조건(ex: month) 반올림 해주고 이하 조건(day)

1 맞춘다.

그래서 2018.02.14 ceiling_date 해주면 2018.03.01 된다.

 

 

 

 

 

문제39(오늘의 마지막 문제)

last_day 함수처럼 first_day 함수도 생성하시오

first_day(Sys.Date() )

 

 

first_day<-function(x){
+   floor_date(x, "month")+ days(0)
+ }
> first_day(Sys.Date())
[1] "2019-02-01"

 

 

*floor_date 바닥, 해당달의 가장낮은, 1일을 뽑아오는 명령어

floor_date(Sys.Date(), "month")
[1] "2019-02-01"

 

 

 

 

 

 

 

문제40. 오라클에 접속해서 오늘부터 돌아오는 월요일의 날짜를

SQL 출력하시오

 

***오라클 11 접속

ORACLE_SID=xe

sqlplus scott/tiger

 

 

select next_day(sysdate,'월요일') from dual;

 

 

 

:

next_day <- function(x,day){

            for(y in 1:7) {

                    check_date = as.Date(x+days(y) )  #우리가 입력한 날짜에 y숫자를 더함!

                      if(format(check_date, '%A')==day) {

                        print(check_date)             }

            }

}

 

 

library(lubridate)

 next_day(Sys.date(), '월요일')
Error in Sys.date() : could not find function "Sys.date"
> next_day(Sys.Date(), '월요일')
[1] "2019-02-18"

 

 

 

# as_Date  숫자를 날짜로 변환해주는 함수

# %A check_date 요일을 뽑는다. if 절에 A 우리가 입력한 '월요일'

일치할 프린트 시키는 것이다.

 

 

 

 

변환함수

오라클

vs

R

to_char

 

as.character

to_number

 

as.integer

to_date

 

as.Date

 

 

as.Factor --> factor 형으로 변환하는 함수

 

 

format 함수

%Y  ---> 년도

%m --->

%d --->

%A ---> 요일

 

 

 

문제41. 이름, 입사 요일을 출력하시오

#이거 매번 해줘야 한다 !!

setwd("d:\\data")

emp<- read.csv("emp.csv", header=T)

emp

 

library(data.table)

data.table(emp$ename, format(as.Date(emp$hiredate), '%A') )                     

 

V1     V2
 1:  SMITH 수요일
 2:  ALLEN 금요일
 3:   WARD 일요일
 4:  JONES 목요일
 5: MARTIN 월요일
 6:  BLAKE 금요일
 7:  CLARK 화요일
 8:  SCOTT 일요일
 9:   KING 화요일
10: TURNER 화요일
11:  ADAMS 토요일
12:  JAMES 목요일
13:   FORD 목요일
14: MILLER 토요일
15:   JACK 토요일

 

 

 

 

 

문제42. 내가 무슨 요일에 태어났는지 출력하시오

 

date <- '1988-04-01'           

data.table(format(as.Date(date), '%A'))

 

#바로숫자 쓰는것도 가능

data.table(format(as.Date('1988-04-01'),'%A'))

 

 

 

 

 

 

문제43. add_months 함수를 R 생성하시오

add_months<-function(sysdate,x){
+             check_date=sysdate+months(x)
+             print(check_date)}
> add_months(Sys.Date(), 100)
[1] "2027-06-15"

 

 

 

 

매번 패키지를 라이브러리 하기 번거롭고

매번 아래의 명령어로 emp 데이터 프레임을 만들기 번거롭다면

아래 해당경로에 있는 파일이 저장! ,R실행할때 마다 자동 실행된다.

 

C:\Program Files\R\R-3.5.2\etc 들어가서

Rprofile.site 워드패드로 열어서

필요 라이브러리 저장

(*setwd read.csv 안됨)

 

*나중에 에러떠서 그냥 지움

 

 

 

일반 함수

오라클

vs

R

nvl함수

 

is.na

decode함수

 

ifelse

case 함수

 

ifelse

 

 

 

 

문제44. 이름,월급,등급을 출력하는데 월급이 1500 이상이면

등급을 A 출력하고 아니면 B 출력하시오

 

SQL> select ename, sal,

case when sal >= 1500 then 'A'

else 'B' end as '등급'

from emp;

 

R:

data.table(emp$ename, emp$sal, ifelse(emp$sal >= 1500, 'A', 'B'))
        V1   V2 V3
 1:  SMITH  800  B
 2:  ALLEN 1600  A
 3:   WARD 1250  B
 4:  JONES 2975  A
 5: MARTIN 1250  B
 6:  BLAKE 2850  A
 7:  CLARK 2450  A
 8:  SCOTT 3000  A
 9:   KING 5000  A
10: TURNER 1500  A
11:  ADAMS 1100  B
12:  JAMES  950  B
13:   FORD 3000  A
14: MILLER 1300  B
15:   JACK 3200  A

 

 

 

 

문제45. 이름,월급,등급을 출력하는데 월급이 3000 이상이면

A 출력하고 월급이 1500 이상이고 3000 보다 작으면 B

출력하고 나머지 사원들은 C 출력하시오 !

 

 

data.table(ename, sal,
+            ifelse(sal >= 3000, 'A',
+                   ifelse(sal >= 1500, 'B', 'C' )))
     ename  sal V3
 1:  SMITH  800  C
 2:  ALLEN 1600  B
 3:   WARD 1250  C
 4:  JONES 2975  B
 5: MARTIN 1250  C
 6:  BLAKE 2850  B
 7:  CLARK 2450  B
 8:  SCOTT 3000  A
 9:   KING 5000  A
10: TURNER 1500  B
11:  ADAMS 1100  C
12:  JAMES  950  C
13:   FORD 3000  A
14: MILLER 1300  C
15:   JACK 3200  A

 

 

 

 

문제46. is.na 함수를 이용해서 커미션이 NA 사원들의 이름, 커미션을

출력하시오 !

 

is.na NA값을 찾기만 하는 함수 !

(*오라클처럼 nvl 해서 변환까지는 안됨)

 

문제9 답이랑 일치

 

 

 

문제47. 이름,커미션을 출력하는데 커미션이 NA 사원들은 no comm 으로

출력되게 하시오 !

 

SQL> select ename, nvl(to_char(comm), 'no comm' )

from emp;

 

> data.table(ENAME='ename', COMM=comm, ifelse(is.na(comm), 'no comm', comm) )
    ENAME COMM      V3
 1: ename   NA no comm
 2: ename  300     300
 3: ename  500     500
 4: ename   NA no comm
 5: ename 1400    1400
 6: ename   NA no comm
 7: ename   NA no comm
 8: ename   NA no comm
 9: ename   NA no comm
10: ename    0       0
11: ename   NA no comm
12: ename   NA no comm
13: ename   NA no comm
14: ename   NA no comm
15: ename   NA no comm

 

 

 

 

 

 


728x90
반응형

'R' 카테고리의 다른 글

SQL과 R과 비교(조인)  (0) 2019.03.09
SQL과 R과 비교(그룹함수)  (0) 2019.03.09
SQL과 R과 비교(연산자)  (0) 2019.03.09
R의 자료구조  (0) 2019.03.09
R 설치 및 R studio, R shiny 설치  (0) 2019.03.09