본문 바로가기

빅데이터과정/R

#47_140819_R_함수

728x90


# 함수



 

함수의 종류


1.     문자

toupper, tolower, substr, length


2.     숫자

power


3.     날짜

difftime, Sys.Date()


4.     변환

as.numric(), as.character(), as.vector(), as.matrix(), as.data.frame(), as.factor(), as.logical(), as.Date()


5.     일반

ifelse

 

  6.   원리

emp[행  ] : emp data frame에서 특정행과 열을 조회

data.frame(  ) : data.frame(vector, vector, vector)

 




as.difftime

units = (days,mins,hours,weeks)

 

 

ls()

어떤 변수가 존재하는지 출력

 



함수 활용 예제


 

>> 이름과 직업을 소문자로 출력

 

> data.frame(tolower(emp$ename),tolower(emp$job))

   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

……………………………………..

 

> data.frame(ename=tolower(emp$ename),job=tolower(emp$job))

    ename       job

1   smith     clerk

2   allen  salesman

3    ward  salesman

4   jones   manager

……………………………………..

 

 

 

>> 이름이 scott인 사원의 이름과 월급을 출력하는데 scott을 소문자로 코딩해서 결과 출력

 

> emp[tolower(emp$ename)=='scott',c("ename","sal" )  ]

  ename  sal

8 SCOTT 3000

 

 

>> 이름과 입사한 날짜부터 오늘까지 총 몇일 근무했는지 출력하시오

 

> data.frame(ename=emp$ename, days=Sys.Date()-as.Date(emp$hiredate))

    ename       days

1   SMITH 12298 days

2   ALLEN 12233 days

3    WARD 12231 days

4   JONES 12192 days

5  MARTIN 12013 days

6   BLAKE 12163 days

7   CLARK 12124 days

8   SCOTT  9984 days

9    KING 11963 days

10 TURNER 12033 days

11  ADAMS  9950 days

12  JAMES 11947 days

13   FORD 11947 days

14 MILLER 11896 days

15   JACK 11896 days

 

 


 

>> 내일 날짜를 출력

 

> Sys.Date() + 1

[1] "2014-08-21"

 

 

>> 오늘부터 4주후의 날짜 출력

 

> Sys.Date() + as.difftime(4,units="weeks")

[1] "2014-09-17"

 

 

>> 100달 뒤의 날짜 출력

 

> Sys.Date() + as.difftime(400,units="weeks")

[1] "2022-04-20"

- ?difftime을 쳐보면 월단위로 측정할 수는 없다

 

 

>> 오늘이 무슨요일인지 출력

 

> format(Sys.Date(), "%A")

[1] "수요일"

 

 

>> 이름월급등급을 출력하는데 월급이 1500 이상이면 A를 출력하고 아니면 출력

 

> data.frame(ename=emp$ename,sal=emp$sal,grade=ifelse(emp$sal>=1500,'A','B'))

    ename  sal grade

1   SMITH  800     B

2   ALLEN 1600     A

3    WARD 1250     B

4   JONES 2975     A

5  MARTIN 1250     B

…………………………………….

 

 

>> 이름부서번호부서위치를 출력하는데 부서번호가 10번이면 NEW YORK, 20번이면 DALLAS, 30번이면 CHICAGO로 하고 나머지 부서번호면 NO LOCK란 글씨 출력

 

ifelse(emp$deptno==10,'NEW YORK',

  (ifelse(emp$deptno==20,'DALLAS',

  (ifelse(emp$deptno==30,'CHICAGO','NO LOCK')))))

 

> loc <- ifelse(emp$deptno==10,'NEW YORK',

   (ifelse(emp$deptno==20,'DALLAS',

   (ifelse(emp$deptno==30,'CHICAGO','NO LOCK')))))

> data.frame(emp$ename, emp$deptno, loc)

   emp.ename emp.deptno      loc

1      SMITH         20   DALLAS

2      ALLEN         30  CHICAGO

3       WARD         30  CHICAGO

4      JONES         20   DALLAS

5     MARTIN         30  CHICAGO

6      BLAKE         30  CHICAGO

7      CLARK         10 NEW YORK

8      SCOTT         20   DALLAS

9       KING         10 NEW YORK

10    TURNER         30  CHICAGO

11     ADAMS         20   DALLAS

12     JAMES         30  CHICAGO

13      FORD         20   DALLAS

14    MILLER         10 NEW YORK

15      JACK         70  NO LOCK

 

 

>> 이름월급커미션을 출력하는데 카미션이 null인 사원들은 출력

 

> ifelse(is.na(emp$comm),0,emp$comm)

 [1]    0  300  500    0 1400    0    0    0    0    0    0    0    0    0    0

> ifelse(complete.cases(emp$comm),emp$comm,0)

 [1]    0  300  500    0 1400    0    0    0    0    0    0    0    0    0    0

> ncomm <-  ifelse(complete.cases(emp$comm),emp$comm,0)

> data.flame(emp$ename,emp$sal,ncomm)

에러함수 "data.flame"를 찾을 수 없습니다

> data.frame(emp$ename,emp$sal,ncomm)

   emp.ename emp.sal ncomm

1      SMITH     800     0

2      ALLEN    1600   300

3       WARD    1250   500

4      JONES    2975     0

5     MARTIN    1250  1400

6      BLAKE    2850     0

7      CLARK    2450     0

8      SCOTT    3000     0

…………………………………….

 

 


 

>> 내일 날짜를 출력

 

> Sys.Date() + 1

[1] "2014-08-21"

 

 

>> 오늘부터 4주후의 날짜 출력

 

> Sys.Date() + as.difftime(4,units="weeks")

[1] "2014-09-17"

 

 

>> 100달 뒤의 날짜 출력

 

> Sys.Date() + as.difftime(400,units="weeks")

[1] "2022-04-20"

- ?difftime을 쳐보면 월단위로 측정할 수는 없다

 

 

>> 오늘이 무슨요일인지 출력

 

> format(Sys.Date(), "%A")

[1] "수요일"

 

 

>> 이름월급등급을 출력하는데 월급이 1500 이상이면 A를 출력하고 아니면 출력

 

> data.frame(ename=emp$ename,sal=emp$sal,grade=ifelse(emp$sal>=1500,'A','B'))

    ename  sal grade

1   SMITH  800     B

2   ALLEN 1600     A

3    WARD 1250     B

4   JONES 2975     A

5  MARTIN 1250     B

…………………………………….

 

 

>> 이름부서번호부서위치를 출력하는데 부서번호가 10번이면 NEW YORK, 20번이면 DALLAS, 30번이면 CHICAGO로 하고 나머지 부서번호면 NO LOCK란 글씨 출력

 

ifelse(emp$deptno==10,'NEW YORK',

  (ifelse(emp$deptno==20,'DALLAS',

  (ifelse(emp$deptno==30,'CHICAGO','NO LOCK')))))

 

> loc <- ifelse(emp$deptno==10,'NEW YORK',

   (ifelse(emp$deptno==20,'DALLAS',

   (ifelse(emp$deptno==30,'CHICAGO','NO LOCK')))))

> data.frame(emp$ename, emp$deptno, loc)

   emp.ename emp.deptno      loc

1      SMITH         20   DALLAS

2      ALLEN         30  CHICAGO

3       WARD         30  CHICAGO

4      JONES         20   DALLAS

5     MARTIN         30  CHICAGO

6      BLAKE         30  CHICAGO

7      CLARK         10 NEW YORK

8      SCOTT         20   DALLAS

9       KING         10 NEW YORK

10    TURNER         30  CHICAGO

11     ADAMS         20   DALLAS

12     JAMES         30  CHICAGO

13      FORD         20   DALLAS

14    MILLER         10 NEW YORK

15      JACK         70  NO LOCK

 

 

>> 이름월급커미션을 출력하는데 카미션이 null인 사원들은 출력

 

> ifelse(is.na(emp$comm),0,emp$comm)

 [1]    0  300  500    0 1400    0    0    0    0    0    0    0    0    0    0

> ifelse(complete.cases(emp$comm),emp$comm,0)

 [1]    0  300  500    0 1400    0    0    0    0    0    0    0    0    0    0

> ncomm <-  ifelse(complete.cases(emp$comm),emp$comm,0)

> data.flame(emp$ename,emp$sal,ncomm)

에러함수 "data.flame"를 찾을 수 없습니다

> data.frame(emp$ename,emp$sal,ncomm)

   emp.ename emp.sal ncomm

1      SMITH     800     0

2      ALLEN    1600   300

3       WARD    1250   500

4      JONES    2975     0

5     MARTIN    1250  1400

6      BLAKE    2850     0

7      CLARK    2450     0

8      SCOTT    3000     0

…………………………………….

 

 




'빅데이터과정 > R' 카테고리의 다른 글

#48_140821_R_JOIN  (0) 2014.08.21
#48_140821_R_GROUP 함수  (1) 2014.08.21
#47_140819_R_정렬  (0) 2014.08.19
#47_140819_R_연산자  (0) 2014.08.19
#47_140819_R_R의 기본  (0) 2014.08.19