[R 프로그래밍] 8. 조건문, 반복문

Author : tmlab / Date : 2016. 10. 4. 00:59 / Category : Lecture/R 프로그래밍


강의자료

조건문, 반복문

2016-04-07

1. 반복문

  • 동일한 연산을 여러번 반복하고 싶을 때 사용합니다
  • 반복문과 함께 사용되는 명령어는 next와 break가 있습니다.
    • 모든 반복문은 next 명령어를 수행할 시에 next 뒤에 있는 연산을 수행하지 않고 다음 반복문을 수행합니다
    • 모든 반복문은 break 명령어를 수행할 시에 반복을 종료합니다.

1.1 for() 문

  • for 연산은 미리 몇번을 반복할지 지정해 줄 수 있습니다
  • 사용법은 for(i in x)로, x에 들어있는 값을 순서대로 i로 가져와서 적용합니다
    • 따라서 실제로 사용되는 값은 x가 아닌 i입니다
  • e.g.,
In [1]:
a<-c(1,2,4)
a
for (i in a) print(i)
  1. 1
  2.  
  3. 2
  4.  
  5. 4
[1] 1
[1] 2
[1] 4
  • 할당을 하지 않아도 이용이 가능합니다
In [2]:
for (i in c(1,2,4))
    print(i)
[1] 1
[1] 2
[1] 4
  • 문자도 역시 받습니다
In [3]:
for (i in c("test","for","for()"))
    print (i)
[1] "test"
[1] "for"
[1] "for()"
  • 다만 확실히 기억할 것은 x의 위치에 들어가 있는 data의 순서대로 i로 받아 사용한다는 사실만 기억하세요
  • 또한 for문에서 {,}없이 연산을 할 경우, for에 들어간 바로 다음줄만 반복되고 그 다음줄은 별개의 코드로 인식합니다
  • 여러 연산을 같이 반복하고 싶다면 {,}으로 감싸 주시면 됩니다
  • e.g.,
In [4]:
for (i in 1:10)
    print(i)
    print("다음줄")
    print(i+1)
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] "다음줄"
[1] 11
In [5]:
for(i in 1:10){
    print(i)
    print("다음줄")
    print(i+1)
}
[1] 1
[1] "다음줄"
[1] 2
[1] 2
[1] "다음줄"
[1] 3
[1] 3
[1] "다음줄"
[1] 4
[1] 4
[1] "다음줄"
[1] 5
[1] 5
[1] "다음줄"
[1] 6
[1] 6
[1] "다음줄"
[1] 7
[1] 7
[1] "다음줄"
[1] 8
[1] 8
[1] "다음줄"
[1] 9
[1] 9
[1] "다음줄"
[1] 10
[1] 10
[1] "다음줄"
[1] 11
  • 응용, vector J의 짝수번째 데이터들만 출력하기
In [6]:
j<- 10:1
j
for (i in seq(2,10,by=2)){
    #j의 짝수번 순서
    print (paste0(i,"번째 데이터: "))
    # 짝수번째 데이터만 불러와짐
    print (j[i])
    }
  1. 10
  2.  
  3. 9
  4.  
  5. 8
  6.  
  7. 7
  8.  
  9. 6
  10.  
  11. 5
  12.  
  13. 4
  14.  
  15. 3
  16.  
  17. 2
  18.  
  19. 1
[1] "2번째 데이터: "
[1] 9
[1] "4번째 데이터: "
[1] 7
[1] "6번째 데이터: "
[1] 5
[1] "8번째 데이터: "
[1] 3
[1] "10번째 데이터: "
[1] 1
  • 꼭 i가 아니어도 됩니다만 그땐 원하는 순서열에 지정한 이름을 꼭 적어주셔야 합니다
In [7]:
for (a in 1:10)
    print(a)
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
  • 앞서 말한 바와 같이, break라는 명령어를 수행하면 반복문은 종료됩니다
In [8]:
for (i in 1:10){
    print(i)
    break
}
[1] 1
  • 원하는 결과값을 출력하고 싶으시면 print나 cat함수를 꼭 써주셔야 합니다. for문에서는 변수이름만 실행시킬 시 값을 출력하지 않습니다
In [9]:
for (a in 1:10)
    a

for문을 사용하여 구구단 2단을 짜보세요

In [10]:
[1] "2*1=2"
[1] "2*2=4"
[1] "2*3=6"
[1] "2*4=8"
[1] "2*5=10"
[1] "2*6=12"
[1] "2*7=14"
[1] "2*8=16"
[1] "2*9=18"

1.2 while() 문

  • for()문과 같이 반복문의 한 종류입니다
  • 사용방법은 while(조건식) 입니다.
  • while문은 조건식과 같이 사용되어지는데, 주어진 조건식이 참일경우 반복합니다
  • 예를 들면, i<-1일 때, while(i<10) print(i) 라고 하면 i<10은 항상 참이니 print(i)는 1을 계속 출력하겠네요
    • 여기에서 보여드릴 순 없습니다... 이게 그 유명한 무한 루프 거든요
    • 무한 루프를 돌려야 할 일이 생긴다면 while(T)를 사용하시면 됩니다. 물론 뒤에 무한루프를 위한 명령어가 나옵니다만....
  • 따라서 while문을 사용할때에는 {,}을 사용합니다
  • e.g.,
In [11]:
i<-1
while(i<10){
    print(i)
    i = i+1
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
  • i가 10이 되는순간 i<10이 False가 됨으로 반복을 그만 두는 것을 확인할 수 있습니다

while문을 사용하여 구구단 3단을 짜보세요

1.3 repeat

  • 무한루프를 위한 명령어
  • break 설정을 걸어주지 않으면 지옥을 맞이 할 수 있습니다
    • 연산이 끝나질 않아요...
  • 여기에서 보시는 if문은 바로 아래에 나옵니다.
    • 궁금하시면 밑을 확인하세요
In [12]:
i<-1
repeat{
    i<-i+1
    if (i %% 2==0) next
    if (i > 30) break
    print(i) 
}
[1] 3
[1] 5
[1] 7
[1] 9
[1] 11
[1] 13
[1] 15
[1] 17
[1] 19
[1] 21
[1] 23
[1] 25
[1] 27
[1] 29
In [13]:
i<-1
repeat{
    i<-i+4
    if (i > 100) break
    print(i) 
}
[1] 5
[1] 9
[1] 13
[1] 17
[1] 21
[1] 25
[1] 29
[1] 33
[1] 37
[1] 41
[1] 45
[1] 49
[1] 53
[1] 57
[1] 61
[1] 65
[1] 69
[1] 73
[1] 77
[1] 81
[1] 85
[1] 89
[1] 93
[1] 97

2. 조건문

2.1 if-else

  • 앞서 배운 조건식과 결합하여 참(TRUE)일 경우 원하는 연산을 하도록 만들어주는 명령어
  • 'if(조건식) 연산' 의 방법으로 사용됩니다
  • A가 B라면 C를 수행해라. 를 만들 수 있습니다
    • if(A==B) C
  • e.g., x라는 vector가 numeric data type 이면 x를 출력
    • is.numeric("data") 함수는 data가 numeric type인지 확인하는 명령어 입니다
    • numeric type이라면 True를, 아니라면 False를 반환합니다.
In [14]:
x<-1:10
is.numeric(x)
TRUE
In [15]:
if(is.numeric(x)) print(x)
 [1]  1  2  3  4  5  6  7  8  9 10
In [16]:
x<-letters[1:10]
is.numeric(x)
FALSE
In [17]:
if(is.numeric(x)) print(x)
  • 만약 한 조건식의 결과값이 여러개라면 if문은 제대로 작동되지 않습니다.
In [18]:
x<- 1:10
x%%2==0
  1. FALSE
  2.  
  3. TRUE
  4.  
  5. FALSE
  6.  
  7. TRUE
  8.  
  9. FALSE
  10.  
  11. TRUE
  12.  
  13. FALSE
  14.  
  15. TRUE
  16.  
  17. FALSE
  18.  
  19. TRUE
In [19]:
if(x%%2==0) print(x)
Warning message:
In if (x%%2 == 0) print(x): length > 1 이라는 조건이 있고, 첫번째 요소만이 사용될 것입니다
  • 또한 여러 조건들을 if문으로 만들어 원하는 데이터에 대한 작업을 자동적으로 수행하게 할 수 있습니다.
In [20]:
x<-89
if(x<=90) print("B")
if(x<=80) print("C")
[1] "B"
  • 단, 이 때 코드가 실행되는 순서는 반드시 첫 줄부터 차례대로 실행이 된다는 사실을 잊으시면 안됩니다.
    • 이 말은, if문은 조건식이 참이면 무조건 실행이 되기 때문에, 여러 조건문에 동시에 참이 된다면 전부 실행이 되는 문제점이 발생 할 수 있다는 것을 말합니다.
In [21]:
x<-80
if(x<=90) print("B") 
if(x<=80) print("C")
[1] "B"
[1] "C"
  • 이를 해결하시려면 순서를 잘 맞추시거나, 조건문을 좀 더 구체적으로 명시하시거나, else를 사용하시는 방법이 있습니다.
    • else문은 if와 연결해서 사용하는데, 앞의 모든 조건들에 해당하지 않는 나머지의 경우에 연산을 수행하도록 하는 함수입니다.
    • A,B,C 라는 데이터를 가진 X가 있다면, X가 A라면 C를 수행, 아니라면 D를 수행하라는 코드를 if(X==A) C else D로 만들 수 있습니다
    • 이 때, 반드시 if와 else는 같은 줄에 위치해야 합니다
    • 이를 사용하여 바로 위의 코드를 수정해보겠습니다.
In [22]:
x<-80
if(x<=90) print("B") else print("C")
[1] "B"
  • if의 조건식을 만족할때 수행하는 수식은 반드시 한개뿐이 안됩니다... 상기의 코드대로만 치면 말이죠
    • 만약 if의 조건식을 만족할 때 수행되는 수식을 두개를 주신다면, 그것은 if랑은 상관없이 독립적으로 수행됩니다
  • 또한 if와 else가 같은줄에 없으면 서로 다른 명령어로 인식하여 첫 if만 수행하고 else 코드에서 에러가 발생합니다
In [23]:
x<-89
if(x>90) 
    print("B")
    x=x+10
    x
99
  • 위와같은 경우, x가 90보다 클 경우 B를 출력하고 x에 10을 더하라는 코드입니다
    • 하지만 90보다 크지 않지만 x에 10을 더한것을 확인 할 수 있습니다
In [24]:
x<-89
if(x<=90) 
    print("B")
x=x+10 
else print("C")
Error in parse(text = x, srcfile = src): <text>:5:1: 예기치 않은 'else'입니다
4: x=x+10 
5: else
   ^
Traceback:
  • 원래는 "B"가 출력되야 하지만, ... 이거 만든 것 포맷이 이상한거니 "B"가 출력되더라도 신경쓰지 마세요
In [25]:
x<-80
if(x<=90) print("B")
    else print("C")
Error in parse(text = x, srcfile = src): <text>:3:5: 예기치 않은 'else'입니다
2: if(x<=90) print("B")
3:     else
       ^
Traceback:
  • 이를 해결하려면 {,}를 사용하시면 됩니다
    • {,} 사이에 있는 연산은 모두 차례대로 수행되며, }뒤에 else가 올 경우 한 줄에 실행하는 것과 같은 효과를 얻을 수 있습니다.
    • {,}를 사용하여 위의 문제를 해결해보겠습니다
In [26]:
x<-91
if(x>90){
    print("B")
   x=x+10
    print(x)
} else {
    "C"
}
[1] "B"
[1] 101
  • 이 때까지의 코드를 보시면 제가 print함수를 쓰는것을 보실 수 있을겁니다.
    • 사실 print를 쓰지 않아도 출력이 됩니다
In [27]:
x<-80
if(x<=90) "B" else "C"
"B"
  • 하지만 여러 연산이 함께 들어갈 경우, 출력은 마지막 하나만 되는 것을 확인 하실 수 있습니다.
In [28]:
x<-91
if(x>90){
    "B"
   x=x+10
    x
} else {
    "C"
}
101
  • 이제 if-else를 심화해서 사용해보겠습니다
    • if와 else를 사용해서 2개 이상의 조건문을 만들고 싶으실 때가 있을겁니다.
    • 그때는 else if라는 명령어를 쓰시면 됩니다
    • else if는 else인 얘들에게 if문을 줄 때 사용됩니다.
In [29]:
x<-70
if(x<70){
    print("F")
}else if(x<80){
    print("C")
}else if(x<90){
    print("B")
}else{
    print("A")
}
[1] "C"
In [30]:
x<-89
if(x<70){
    print("F")
}else if(x<80){
    print("C")
}else if(x<90){
    print("B")
}else{
    print("A")
}
[1] "B"
  • char라는 변수에 letters를 넣고, 문자 vector면 "character vector"를, 숫자 vector면 "not character vector"를 출력하는 if문을 만들어보세요
    • 데이터가 숫자인지 확인하는 명령어는 is.numeric(), 문자인지 확인하는 명령어는 is.character()입니다
In [31]:
[1] "character vector"

2.2 ifelse

  • else if랑 혼동되게 생겼지만 다른 함수입니다
  • 해당 명령어는 Excel의 IF 함수와 같은 기능을 합니다
  • 프로그래밍적으로 말한다면 삼항연산자라고 부릅니다
  • 사용방법은 ifelse(조건식,참일때 값,거짓일때 값)입니다
    • e.g., ifelse(1>2,"거짓","참")이면 "참"이 출력되겠네요
In [32]:
1>2
ifelse(1>2,"거짓","참")
FALSE
"참"

3. 조건문과 반복문을 같이 사용하기

  • 자 이제부터 두 구문을 혼합해서 사용해보겠습니다
  • 앞선 if에서 1부터 10까지의 수가 들어간 vector인 X에서 짝수만 출력하고자 했으나 잘못된 결과가 나온 부분이 있었을 겁니다
    • e.g.,
    • x<- 1:10
    • x%%2==0
    • if(x%%2==0) print(x)
  • 이 구문을 저희가 원하는 대로 출력해보도록 하겠습니다.
In [33]:
x<-1:10
for(i in x){
    if(i%%2==0){
        print(i)
    }
}
[1] 2
[1] 4
[1] 6
[1] 8
[1] 10

"어때요. 정말 쉽죠?"

  • 그리고 앞서 설명을 했어야 했으나 for문과 if를 알아야 해서 설명을 못했던 next와 break를 설명하겠습니다

next

  • next는 앞서 말한바와 같이, 수행이 되면 반복문의 끝으로 이동해서 다음 반복문으로 돌아가는 것입니다
  • e.g.,
In [34]:
for (i in 1:10){
  if(i %% 2 == 0){
    next
  }
  print(i)
}
[1] 1
[1] 3
[1] 5
[1] 7
[1] 9
  • 다음은 상단의 연산과정을 설명하는 그림입니다.exp1

break

  • break또한 앞서 말한바와 같이, 수행이 되면 반복문을 종료하는 명령어입니다.
  • e.g.,
In [35]:
for (i in 1:10){
  if(i > 6){
    break
  }
  print(i)
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
  • 역시 상단의 연산과정을 설명하는 그림입니다exp2

1. x에 1에서부터 11까지의 숫자를 넣으세요

2. 각 숫자에 2를 곱하여 출력합니다

조건

  • 단 곱하는 수가 홀수인 경우 제외하시고, 9가 곱해진 다음에 반복문이 종료되게 만드세요
In [36]:
x<-1:11

for(i in x){
    if(i%%2==1){
        next
    }else if(i==10){
        break
    }else{
        print(2*i)
    }        
}
[1] 4
[1] 8
[1] 12
[1] 16

과제

  • 다음의 주어진 데이터를 가지고 아래의 과제를 풀어보세요
    • a와 b의 데이터는 화면에 출력된 data를 복사해서 사용하세요
In [46]:
a<-sample(1:10,10,replace=T)
b<-sample(1:10,10,replace=T)
cat("a:",a,"\n")
cat("b:",b)
a: 9 6 5 1 3 3 5 10 2 5 
b: 4 9 2 3 1 5 3 3 10 5
  • 이제 for문과 if문을 사용하여 a와 b의 같은 순서에 있는 숫자를 비교해서 큰 수를 지닌 변수의 이름을 출력하세요
    • 두 변수의 수가 같다면 next를 사용하여 다음 수로 넘어가세요
    • vector subsetting을 기억하세요
In [47]:
# for문을 작성하세요
[1] "a"
[1] "b"
[1] "a"
[1] "b"
[1] "a"
[1] "b"
[1] "a"
[1] "a"
[1] "b"
  • 작성하신 코드를 조금 수정하여, a와 b가 각각 몇번 출력되는지 출력하세요
In [48]:
num<-0
num1<-0

###
# for문을 작성하세요
###

cat("a는 총",num,"번 출력되었습니다\n")
cat("b는 총",num1,"번 출력되었습니다")
a는 총 5 번 출력되었습니다
b는 총 4 번 출력되었습니다


Archives

05-16 16:09

Contact Us

Address
경기도 수원시 영통구 원천동 산5번지 아주대학교 다산관 429호

E-mail
textminings@gmail.com

Phone
031-219-2910

Tags

Calendar

«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Copyright © All Rights Reserved
Designed by CMSFactory.NET