티스토리 뷰
조건문
조건문은 주어진 값에 따라 조건에 맞으면 문장 출력 또는 명령어 수행을 합니다.
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문은 벡터 연산이 가능하므로 무조건 &연산자만 사용해야 합니다.
참고: KIC 캠퍼스 머신러닝기반의 빅데이터분석 양성과정
'R > Process' 카테고리의 다른 글
[R] 문자열 관련 함수 - stringr 패키지, 정규식 (1) | 2019.01.01 |
---|---|
[R] 반복문 - for, while, next, repeat, exit, break (2) | 2019.01.01 |
[R] 데이터 타입 변환 함수 (0) | 2018.12.27 |
[R] 데이터 프레임(date frame) (0) | 2018.12.27 |
[R] 배열(Array) (0) | 2018.12.27 |