티스토리 뷰

반응형

조건문


조건문은 주어진 값에 따라 조건에 맞으면 문장 출력 또는 명령어 수행을 합니다.



참고: 조건문의 단짝 반복문

[R] 반복문 - for, while, next, repeat, exit, break

 


 

1. if 문

 

조건문에서 if문의 장점은 문장 출력과 다른 명령어 수행을 할 수 있다는 점,

단점은 벡터 연산이 불가하고 오로지 하나의 조건에 대해서만 검사가 가능하다는 점 이라고 할 수 있습니다.

 

if ( 조건 ) {
   
(조건이 True일 때 실행될) 문장 또는 명령어

} else {

    (조건이 False일 때 실행될) 문장 또는 명령어

}

 

> grade <- 75

> if (grade >= 70) {       

+   print('합격')

+ } else {

+   print('불합격')

+ }

[1] "합격"


> vec1 <- c(10,20,30)

> if (vec1 == 10) {       

+   print('인사부')

+ } else {

+   print('총무부')

+ }

[1] "인사부"                        # 결과값이 인사부인 이유는 첫 번째 요소인 10에 대해서만 조건 치환을 적용하기 때문

Warning message:

In if (vec1 == 10) { :

  the condition has length > 1 and only the first element will be used     # if문은 벡터 연산 불가

 

 if문은 반복 연산이 불가하기 때문에 

반복 연산이 필요하다면 for문(반복문)이나 if else문을 사용해야합니다.

 

 



2. if문의 else if 구문


 조건문에서 else if문 if문과 동일하게 문장 출력과 다른 명령어를 수행하고, 장점은 여러 조건에 대해서 검사가 가능합니다.

단점은 if문과 같이 벡터 연산이 불가하다는 점.


if ( 조건 1 ) {
    
('조건1'일 때 실행될) 문장 또는 명령어

else if ( 조건 2 ){

   ('조건1'이 아니고 '조건2'일 때 실행될) 문장 또는 명령어

else {

    ('조건1'도, '조건2'도 아닐 때 실행될) 문장 또는 명령어

}


> grade <- 'A'

> if (grade == 'A') {       

+   print('합격')

+ } else if (grade == 'B') { 

+   print('보류')

+ } else {

+   print('불합격')

+ }

[1] "합격"


> vec1 <- c(10,20,30)

> if (vec1 == 10) {       

+   print('인사부')

+ } else if (vec1 == 20) { 

+   print('재무부')

+ } else {

+   print('총무부')

+ }

[1] "인사부"                              # 결과값이 인사부인 이유는 첫 번째 요소인 10에 대해서만 조건 치환을 적용하기 때문

Warning message:

In if (vec1 == 10) { :

  the condition has length > 1 and only the first element will be used     # else if문은 벡터 연산 불가





3. ifelse 문

 

 조건문에서 ifelse문의 장점은 if문의 한계를 해결하여 벡터 연산(각 요소별 조건 검사)이 가능합니다.
단점은 주어진 값에 따라 yes or no 를 반환해주고, 리턴값만 반환하기 때문에 오직 출력만 가능하고 조건별 명령어 수행은 불가합니다. 


ifelse ( 조건, True일 때 리턴할 값, False일 때 리턴할 값)


> vec1 <- c(10,20,30)

> ifelse (vec1 == 10, '인사부', '총무부')      # in oracle : decode(vec1,10, '인사부', '총무부')

[1] "인사부" "총무부" "총무부"



# ifelse 는 중복사용도 가능합니다.

> ifelse (vec1 == 10, '인사부',

+         ifelse (vec1 == 20, '재무부', '총무부'))

[1] "인사부" "재무부" "총무부"

 

 

 


Q.
# Q1. emp date frame에서 deptno를 기반으로 부서명을 갖는 dename 컬럼 추가
     ( 10 : 인사부, 20 : 재무부, 30 : 총무부)

> emp

   EMPNO  ENAME       JOB  MGR        HIREDATE  SAL COMM DEPTNO

1   7369  SMITH     CLERK 7902 1980-12-17 0:00  800   NA     20

2   7499  ALLEN  SALESMAN 7698 1981-02-20 0:00 1600  300     30

...

13  7902   FORD   ANALYST 7566 1981-12-03 0:00 3000   NA     20

14  7934 MILLER     CLERK 7782 1982-01-23 0:00 1300   NA     10

> dname <- ifelse(emp$DEPTNO == 10, '인사부',

+                 ifelse (emp$DEPTNO == 20, '재무부', '총무부'))

> emp$dname <- dname

> emp

   EMPNO  ENAME       JOB  MGR        HIREDATE  SAL COMM DEPTNO  dname

1   7369  SMITH     CLERK 7902 1980-12-17 0:00  800   NA     20          재무부

2   7499  ALLEN  SALESMAN 7698 1981-02-20 0:00 1600  300     30       총무부

...

13  7902   FORD   ANALYST 7566 1981-12-03 0:00 3000   NA     20       재무부

14  7934 MILLER     CLERK 7782 1982-01-23 0:00 1300   NA     10         인사부



# Q2. deptno가 10이면서 sal이 4000이상인 사람은 "임원후보"로 출력
# 1) if문 (벡터 연산 불가)

> if (emp$DEPTNO == 10 & emp$SAL > 4000) {    

+   print('임원후보')

+ } else {

+   print('임원후보아님')

+ }

[1] "임원후보아님"

Warning message:

In if (emp$DEPTNO == 10 & emp$SAL > 4000) { :

  the condition has length > 1 and only the first element will be used


# 2) ifelse문 (벡터 연산 가능)

> ifelse(emp$DEPTNO == 10 & emp$SAL > 4000, '임원후보','임원후보아님')

 [1] "임원후보아님" "임원후보아님" "임원후보아님" "임원후보아님" "임원후보아님" "임원후보아님" "임원후보아님" "임원후보아님"

 [9] "임원후보"     "임원후보아님" "임원후보아님" "임원후보아님" "임원후보아님" "임원후보아님"


# 진리값 연산자 사용 시 주의사항
# &  : 각 요소별 여러개의 논리 연산 가능 (벡터 비교 가능)
# && : 단 하나의 논리 연산만 가능 (벡터 비교 불가능)

# if문은 벡터 연산이 불가능하여 진리값 하나만 판단하므로 사실 &, &&연산자 둘 다 상관없지만 
   ifelse문은 벡터 연산이 가능하므로 무조건 &연산자만 사용해야 합니다.
R 진리값 연산자 참고

[R] 진리값, 진리값의 연산자 

 

 


 


 

참고: KIC 캠퍼스 머신러닝기반의 빅데이터분석 양성과정


 

반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday