본문 바로가기
R/Data Operation

R 조건문 - if/ifelse/switch/which

by 통계열등생 2020. 10. 27.
반응형

조건문은 조건이 참인지 거짓인지에 따라 달라지는 계산이나 상황을 수행한다.

조건문에도 종류가 여러가지 있다.

 

 ◎ if

if( 조건식 ) 실행문
> score = 85
> if(score >= 80) cat('합격')
합격
> if(score >= 80) print('합격')
[1] "합격"

print() 함수를 쓰면 출력결과 앞에 인덱스도 함께 출력된다.

 

> if(TRUE) {score = 100
+           cat('점수는', score, '점이다')}
점수는 100 점이다
> if(T) score = 100; cat('점수는', score, '점이다')
점수는 100 점이다

조건문 자리에 T or TURE 를 사용하면 실행문을 무조건 실행한다.

실행문이 두 문장 이상이면 중괄호를 사용하거나 문장들 사이에 세미콜론(;)을 붙여 조건문을 작성한다.

중괄호는 블록(block)의 의미로 사용된다.

 

> if(F) cat(score)

조건문 자리에 F or FALSE 를 사용하면 실행문을 실행하지 않는다.

 

 

 ◎ if else

if( 조건식 ) 실행문1 else 실행문2

if( 조건식1 ) 실행문1 else if( 조건식2 ) 실행문2 else ... if( 조건식n ) 실행문n else 실행문n+1

> score = 75
> if(score >= 80) cat('합격\n') else cat('불합격\n')
불합격
>
> if(score >= 80) cat('합격\n') else 
+   cat('불합격\n')
불합격
>
> if(score >= 80) {cat('합격\n')
+   } else {cat('불합격\n')} 
불합격

else 문은 {실행문1}과 같은 행에 작성하여야 한다. 그렇지 않으면 오류가 발생한다.

cat() 함수안에 '\n' 을 써준 이유는 cat() 함수는 코드를 각각 실행했을 때는 문제가 없지만 코드를 한꺼번에 실행했을 경우 아래 코드처럼 출력결과물 뒤로 코드가 붙어서 줄바꿈코드인 '\n' 를 써줘야 보기에 좋다.

> if(score >= 80) cat('합격') else cat('불합격')
불합격> cat('-------')
-------

 

> score = 75
> if(score >= 90) grade = 'A' else
+ if(score >= 80) grade = 'B' else
+ if(score >= 70) grade = 'C' else
+ if(score >= 60) grade = 'D' else grade = 'F'
> grade
[1] "C"

조건에 따라 경우의 수가 3가지 이상일 때 if else 문을 중복해서 사용한다.

 

> install.packages('stringr')
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:

https://cran.rstudio.com/bin/windows/Rtools/
Installing package into ‘C:/Users/small22/Documents/R/win-library/4.0’
(as ‘lib’ is unspecified)
URL 'https://cran.rstudio.com/bin/windows/contrib/4.0/stringr_1.4.0.zip'을 시도합니다
Content type 'application/zip' length 216099 bytes (211 KB)
downloaded 211 KB

package ‘stringr’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\Public\Documents\ESTsoft\CreatorTemp\RtmpiETJz9\downloaded_packages
> library(stringr)
> jumin = '123456-4234567'
> gender = str_sub(jumin, 8, 8)  # 성별추출하기
> gender
[1] "4"

문자열의 일부분을 추출하기 위해 'stringr' 패키지를 설치하고 라이브러리에 올린 후 주민번호로 성별을 판별하는 두가지 if else문을 작성하였다.

> if(gender==1) cat('남자') else
+ if(gender==2) cat('여자') else
+ if(gender==3) cat('남자') else
+ if(gender==4) cat('여자') else cat('주민번호 양식 틀림')
여자
> if(gender==1 | gender==3) cat('남자') else
+ if(gender==2 | gender==4) cat('여자') else cat('주민번호 양식 틀림')
여자

 

 

 ◎ ifelse

ifelse( 조건식, 참, 거짓 )
ifelse( 조건식, 참, ifelse( 조건식, 참, ifelse( 조건식, 참, 거짓 ) ) )
> score = c(78, 85, 95, 45, 65)
> grade = ifelse(score >= 70, '합격', '실패')
> grade
[1] "합격" "합격" "합격" "실패" "실패"

ifelse() 함수의 조건식 부분에 벡터를 넣으면 결과도 벡터로 반환한다.

 

> grade = ifelse(score >= 70, '합격', ifelse(score >= 60, '보류', '실패'))
> grade
[1] "합격" "합격" "합격" "실패" "보류"

조건에 따라 경우의 수가 3가지 이상일 때는 ifelse() 함수의 거짓 부분에 ifelse() 함수를 다시 사용함으로써 표현할 수 있다.

 

> x = c(75, 85, 42, NA, 85)
> ifelse(is.na(x)==T, mean(x,na.rm=T), x)  # 평균대체
[1] 75.00 85.00 42.00 71.75 85.00
> ifelse(is.na(x)==T, 0, x)  # 0 대체
[1] 75 85 42  0 85

결측치가 포함되어있는 데이터도 평균이나 0으로 결측치를 대체할 수 있다.

 

 

 ◎ switch

switch( 비교문, 실행문1, 실행문2, 실행문3, ... )
> name = 2
> ans = switch(name, "kim", "han", "lee")
> cat(ans, '\n')
han 

 

> switch(pwd, age=25, name="kim", id="small", pwd="1234") 
에러: 객체 'pwd'를 찾을 수 없습니다
> switch('pwd', age=25, name="kim", id="small", pwd="1234") 
[1] "1234"

switch() 함수의 첫번째 자리에 2를 입력하면 출력값은 2+1자리의 값이다.

또한 첫번째 자리에 key를 입력하면 해당 키의 값이 출력되는데 이때 key는 따옴표안에 넣어야 한다.

 

 

 ◎ which

> name = c("kim", "lee", "choi", "park") 
> which(name == "choi")
[1] 3

which() 함수에 조건식을 입력하면 조건식에 만족하는 값의 위치를 반환한다.

 

 

 

 

 

<R 조건문 - if/ifelse/switch/which>

반응형

댓글