본문 바로가기
my_lesson/_R_컴퓨팅

R_컴퓨팅 - 프로그래밍 기본 구조[2] - 제어문 , 반복문, 분기문

by boolean 2019. 2. 14.
728x90

R_컴퓨팅 - 프로그래밍 기본 구조[2] - 제어문 , 반복문, 분기문

1. 조건문



1) if 문


● 조건이 적용되는 괄호() 안의 조건이 참이면 실행


 


조건을 판단 연산자로는 


'같다(==)', 


'같지 않다(!=)', 


'크거나 같다(>=)', 


'크다(>)', 


'작거나 같다(<=)', 


'작다(<)'


가 있습니다. 


 



> x <- c(1,2,3,4,5)

> x

[1] 1 2 3 4 5


> y <- x + 5

> y

[1]  6  7  8  9 10


> if (sum(x) < sum(y)) print(x)

[1] 1 2 3 4 5

> if (sum(x) < sum(y)) {print(x);print(mean(x));print(var(x))}

[1] 1 2 3 4 5

[1] 3

[1] 2.5

 


위와 같이 한 줄내의 ; 로 분리하여 실행문을 구분이 가능하지만, 문장이 복잡해 보임


아래와 같이 여러줄의 문장으로 가능 문장의 연결에는 + 기호가 사용됨


 


> if (sum(x) < sum(y)) {

+ print(x)

+ print(mean(x))

+ print(var(x))

+ }

[1] 1 2 3 4 5

[1] 3

[1] 2.5

 


 


● 조건이 거짓이면 else 문의 내용이 실행

 


> if (mean(x) > mean(y)){

+ print(paste("mean(x) 가 ",mean(x)-mean(y),"만큼 크다."))

+ } else {

+ print(paste("mean(y) 가 ",mean(y)-mean(x),"만큼 크다."))

+ }

[1] "mean(y) 가  5 만큼 크다."

 



(참고) 실행되는 조건이 여러개인 경우 {} 로 묶어 실행 일반적으로 단일 실행문은 사용하지 말것


 

2) ifelse 문



ifelse() 문의 괄호내의 첫번째 인수의 비교 구문이 참일때 두번째 인수의 구문이 실행되고, 첫번째 인수의


비교 구문이 거짓일때 세번째 인수의 구문이 실행된다.




ifelse(x == y, true, false)   # ifelse(비교 구문, TRUE 일때 실행 구문, FALSE 일때 실행 구문)


 


> x <- c(1,2,3,4,5)

> x

[1] 1 2 3 4 5


> y <- x + 5

> y

[1]  6  7  8  9 10


> ifelse(mean(x)>mean(y), print(paste("mean(x) 가 ",mean(x)-mean(y),"만큼 크다.")), print(paste("mean(y) 가 ",mean(y)-mean(x),"만큼 크다.")))

[1] "mean(y) 가  5 만큼 크다."

 


 


● 벡터에서 짝수일때 0으로 홀수일때 1로 치환하는 예제


 > n <- 1:10

> n

 [1]  1  2  3  4  5  6  7  8  9 10


> x <- ifelse(n %% 2 == 0, 0, 1)

> x

 [1] 1 0 1 0 1 0 1 0 1 0

 


위식에서 조건문에 대한 내용은 아래와 같은 벡터이다.


> n %% 2

 [1] 1 0 1 0 1 0 1 0 1 0





​● 벡터에서 5보다 작으면 +5를하고, 그렇지 않으면 -5를 적용하는 예제



> x <- ifelse(n <= 5, n+5, n-5)

> x

 [1]  6  7  8  9 10  1  2  3  4  5



3) switch 문




switch() 문의 괄호내의 비교구문(첫 번째 인수의 값)에 일치하는 값을 가진 구문의 내용이 실행된다.


 


switch("x", a="가", b="나", c="다", x="라")   




# switch(비교 구문, 실행구문1, 실행구문2, 실행구문3)




위의 단순 예를 보면 x 값은 라와 일치하게 된다.


 


아래의 예제는 "중1", "중3"일때 나이를 찾는 구문이다 


 


> sclass <- "중1"

> sclass

[1] "중1"

> switch(sclass, 중1="14살", 중2="15살", 중3="16살")

[1] "14살"

> sclass <- "중3"

> switch(sclass, 중1="14살", 중2="15살", 중3="16살")

[1] "16살"


> sclass <- "중5"

> switch(sclass, 중1="14살", 중2="15살", 중3="16살") # 일치하는 항목이 없는 경우 아무것도 출력되지 않음

 


 


 


switch()의 첫번째 인수가 정수인 경우에는 주어진, 정수가 나타내는 순서에 있는 구문이 실행


 


조건문에 1 이라는 값이 주어진 경우 첫번째 주어진 실행 구문이 실행된다.


 


> sclass <- 1

> switch(sclass, "14살", "15살", "16살")

[1] "14살"



조건문에 3 이라는 값이 주어진 경우 세번째 주어진 실행 구문이 실행된다.



> sclass <- 3

> switch(sclass, "14살", "15살", "16살")

[1] "16살"


> sclass <- 4

> switch(sclass, "14살", "15살", "16살") # 일치하는 항목이 없는 경우 아무것도 출력되지 않음

 


 


4) which() 문




which()의 괄호내의 조건에 해당하는 위치(인덱스)를 출력한다.



● 벡터에서의 사용


> letters

[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"

> which(letters=="f")

[1] 6


 


 


● 데이터프레임에서 사용


 


> 성적

   학번 성명 국어 수학 영어

1     1 길동    8    7    2

2     2 철수    6    5    7

3     3 영수    9    4    9

4     4 미자    4    5    7

5     5 동화    5    8    9

6     6 은미    5    9    6

7     7 인수    4    7   10

8     8 영희   10   10    9

9     9 미정    7    5    4

10   10 효선    7    7    5


------------------------------------------------

> which(성적$성명=="은미")

[1] 6

 


조건에 만족하는 값이 하나만 존재하는 경우


 


> which(성적 == "은미")

[1] 16

> which(성적 == "은미", arr.ind=FALSE)

[1] 16

> which(성적 == "은미", arr.ind=TRUE)

     row col

[1,]   6   2


------------------------------------------------


 


조건에 만족하는 값이 여러개 존재하는 경우


> which(성적 == 10)

[1] 10 28 38 47

> which(성적 == 10, arr.ind=FALSE) #성적중에 10이 존재하는 벡터의 위치

[1] 10 28 38 47

> which(성적 == 10, arr.ind=TRUE) #성적중에 10이 존재하는 행렬 위치

     row col

[1,]  10   1

[2,]   8   3

[3,]   8   4

[4,]   7   5

------------------------------------------------




행렬에서 사용


 


> mtx <- matrix(1:16, 4, 4)

​> mtx

     [,1] [,2] [,3] [,4]

[1,]    1    5    9   13

[2,]    2    6   10   14

[3,]    3    7   11   15

[4,]    4    8   12   16

> which(mtx %% 4 == 0, arr.ind=TRUE)

     row col

[1,]   4   1

[2,]   4   2

[3,]   4   3

[4,]   4   4

> which(mtx %% 4 == 0, arr.ind=FALSE)

[1]  4  8 12 16

 


 


 


 


 


2. 반복문




for문은 정해진 반복횟수 만큼 실행되고, while 구문은 특정조건이 만족되는 동안 실행되는 반복문이다.






1) for 문




for() 문은 for(변수 in 반복횟수) {실행문} 형태로서 반복횟수 대괄호 내에 위치한 실행문을 실행




아래 예제는 1에서 10까지의 숫자를 모두 더해서 출력하는 예제이다.


> sumx <- 0


> for(i in 1:10){

+ sumx = sumx + i

+ }

> sumx

[1] 55




아래 예제는 1에서 10까지의 숫자를 순서대로 더해서 각각 출력하는 예제이다.


> runsumx <- 0


> for(i in 1:10){

+ runsumx = runsumx + i

+ print(runsumx)

+ }


[1] 1

[1] 3

[1] 6

[1] 10

[1] 15

[1] 21

[1] 28

[1] 36

[1] 45

[1] 55





2) while 문


 


while() 은 while(조건) {실행문}의 형태로 조건이 참인 경우 계속 실행문 반복


 


 


아래 예제는 1에서 10까지의 숫자를 모두 더해서 출력하는 예제이다.



> sumx  <- 0

> i  <- 1


> while(i<=10){

+ sumx = sumx + i

+ i = i + 1

+ }


> sumx

[1] 55

 




아래 예제는 1에서 10까지의 숫자를 순서대로 더해서 각각 출력하는 예제이다.




> runsumx  <- 0

> i <- 1


> while(i<=10){

+ runsumx = runsumx + i

+ i = i + 1

+ print(runsumx)

+ }


[1] 1

[1] 3

[1] 6

[1] 10

[1] 15

[1] 21

[1] 28

[1] 36

[1] 45

[1] 55

 


 


3) repeat 문


 


repeat() 문은 실행문내에서 break문을 만날때까지 계속 실행되는 구문


 


> sumx <- 0

> i <- 1


> repeat{

+ sumx = sumx + i

+ i = i + 1

+ if(i>10){

+ break

+ }

+ }

> sumx

[1] 55

 


> runsumx <- 0

> i <- 1


> repeat{

+ runsumx = runsumx + i

+ i = i + 1

+ print(runsumx)

+ if(i>10){

+ break

+ }

+ }


[1] 1

[1] 3

[1] 6

[1] 10

[1] 15

[1] 21

[1] 28

[1] 36

[1] 45

[1] 55





3. 반복문 내의 분기문




1) break 문


현재 실행되고 있는 반복문을 중지하고 반복문을 빠져나가는 구문,


참고로 반복문이 중첩되어 사용되는 경우 break 구문은 break 구문이 포함된 단계의 반복문만 빠져나간다.






아래의 예제는 1부터 10까지 값을 더해서 각각 출력하는 구문인데, 누적합계가 35 보다 크면 for 구문을


빠져나가는 예제이다.





> sumx  <- 0

> for(i in 1:10){

+ sumx = sumx + i

+ if(sumx>35){

+ break

+ }

+ print(paste(i,":",sumx))

+ }


[1] "1 : 1"

[1] "2 : 3"

[1] "3 : 6"

[1] "4 : 10"

[1] "5 : 15"

[1] "6 : 21"

[1] "7 : 28"





2) next 문


 


반복문에서 특정조건이 만족하면 next 문 이후의 실행문은 실행되지 않음


(break 는 조건문을 빠져나가지만 next 문은 next 구문 이후의 구문은 실행하지 않고 반복문은 계속 실행됨)




> sumx <- 0


> for(i in 1:10){

+ sumx = sumx + i

+ if(sumx<35) next  # sumx 가 35보다 작은 경우에는 for루프내의 아래 구문은 실행되지 않음

+ print(paste(i,":",sumx))

+ }


[1] "8 : 36"

[1] "9 : 45"

[1] "10 : 55"

댓글