이 절에서는 프로그래밍의 필수 요소가 되는 조건문과 반복문(if, for, while, repeat)에 대해서 알아본다. 문법은 대부분의 언어와 유사하므로 어렵지 않게 익힐 수 있을것이다. switch 문도 존재하지만 잘 사용하지 않으며, 대신 조건문을 많이 사용한다.
if
먼저 조건에 따라 코드의 수행 여부를 결정하는 if 문에 대해 살펴본다. 다음은 if 문의 문법 구조를 정리한 표다.
문법 | 의미 |
if (cond) {cond가 참일 때 실행할 문장} else {cond가 거짓일 때 실행할 문장} | 조건 cond가 참, 거짓인 경우에 따라 {}블록을 실행한다. 필요한 경우 else 블록을 지정할 수 있다. |
다수의 TRUE, FALSE 데이터를 한 번에 처리한다면 ifelse() 함수를 고려할 수 있다.
-ifelse : 주어진 test 값에 따라 yes 또는 no 값을 반환한다.
ifelse(test,yes,no)
test에 다수의 TRUE, FALSE가 저장되어 있을 때 TRUE에 대해서는 yes 값을, FALSE에 대해서는 no 값을 선택하여 반환한다.
조건문 if의 예를 살펴보자.
>if(TRUE){ + print("TRUE") + print("hello") +}else{ + print("FALSE") + print("world") } [1]"TRUE" [1]"hello" |
위 코드의 결과는 "TRUE", "hello"다.
ifelse()를 사용하면 if 문을 다수의 데이터에 한 번에 적용하는 연산이 가능하다. 다음은 1,2,3,4,5에서 값이 짝수일 경우 "even", 홀수일 경우 "odd"를 출력하는 예다.
>x<-c(1,2,3,4,5) >ifelse(x %%2==0, "even","odd") [1]"odd", "even", "odd", "even", "odd" |
반복문
R의 반복문에는 for, while, repeat 문이 있다. 다음은 이 세 가지 문법을 설명한 표다.
문법 | 의미 |
for(i in data){i를 사용한 문장} | data에 들어 있는 각각의 값을 변수 i에 할당하면서 각각에 대해 블록 안의 문장을 수행한다. |
while(cond){조건이 참일 때 수행할 문장} | 조건 cond가 참일 때 블록 안의 문장을 수행한다. |
repeat{반복해서 수행할 문장} | 블록 안의 문장을 반복해서 수행한다. repeat은 다른 언어의 do-while에 해당한다. |
반복문 내 블록에서는 break,next문을 사용해 반복의 수행을 조정할 수 있다.
-break : 반복문을 종료한다.
-next : 현재 수행 중인 반복문 블록의 수행을 중단하고 다음 반복을 시작한다.
>for ( i in 1:10){print(i)} [1]1 [1]2 [1]3 ... [1]10 |
다음 while 문은 1부터 10까지 숫자를 출력하기 위해 변수 i의 값을 10과 비교하면서 print()하는 예다.
>i<-1 >while(i<=10){ + print(i) + i<-i+1 } [1]1 [1]2 [1]3 ... [1]10 |
while문에서 next를 사용해 짝수만 출력해보자. 값이 짝수인지 확인하는 데는 나머지 연산자 %%를 사용했다.
>i<-0 >while(i<=9){ + i<-i+1 + if (i %%2 !=0){ + next + } + print(i) +} [1]2 [1]4 [1]6 [1]8 [1]10 |
다음은 repeat을 사용해서 1부터 10까지 값을 출력한 예다. repeat문에서 조건을 지정하려면 블록 내부에서 if문으로 조건을 확인하고 break로 빠져나오도록 해야한다.
>i<-1 >repeat{ + print(i) + if(i>=10) { + break + } + i<-i+1 +} [1]1 [1]2 [1]3 ... [1]10 |
R을 이용한 데이터 처리&분석 실무 中
'R > R을 이용한 데이터 처리&분석 실무' 카테고리의 다른 글
함수의 정의 (0) | 2020.01.30 |
---|---|
연산 (0) | 2020.01.30 |
타입 판별, 타입변환 (0) | 2020.01.29 |
데이터 프레임 (0) | 2020.01.29 |
리스트 (0) | 2020.01.28 |