R복습_제어문의 종류 조건문,반복문,기타 제어문(if, while, for,이중for, break,next)

2024. 9. 30. 11:01R분석

제어문

제어문이란 프로그램의 흐름을 반복하거나 조건을 통해 제어하는 것을 의미한다.

 

조건문

조건문이란 조건이 있을때 참과 거짓의 결과로 프로그램의 흐름을 바꾸는 것을 의미힌다. 
 
조건문의 종류

  • if 문 : 조건식의결과값이 TRUE면 {}영역안의 코드가 실행
  • else if 문 : 위의 조건식이 거짓이고 else if의 조건식이 참이면 실행
  • else문: 위의 조건식들이 모두 거짓이면 실행
  • if~if문 : 개별 if문으로 모든 실행문이 실행

 

if문

#조건문

#if 조건문
#if(조건식){조건식이 참일때 실행할 문장}

#조건식이 참일경우
if(TRUE){
  print('조건문 안의 문장')
}
print('조건문 밖의 문장')

#조건식이 거짓일경우
if(FALSE){
  print('조건문 안의 문장')
}
print('조건문 밖의 문장') #조건문 밖의 문장만 출력

 

r에서 if조건문은 if(조건식){참일경우 실행}의 형태로 작성하며 ()괄호안의 조건이 참일경우에만 {}괄호안의 내용이 실행되는 형식이며 며, 만약 ()괄호안의 조건식의 답이 FALSE라면 아무것도 실행되지 않는다.
 
 

if ~ else if문

#if ~ else if
my_age <- 25

if(my_age>=20){ #조건식1이 참일경우 실행
  print('성인입니다')
}else if(my_age>=17){
  print('고등학생 입니다') #조건식 1이 거짓이고 2가 참일경우 실행
}else if(my_age>=14){
  print('중학생 입니다') #조건식 1,2가 거짓이고 3이 참일경우 실행
}else if(my_age>=10){
  print('초등학생입니다') #조건식1,2,3이 거짓이고 4가 참일경우 실행
}
print('프로그램을 종료합니다.') #조건문 밖의 문장

 
else if문은 위의 조건식이 거짓이고 else if문의 조건식이 참이면 실행되는 조건문이다. else if의 조건문은 조건문에 조건이 여러개일 경우에 실행한다.
 
 

else문

#if ~ else if~ else
class <- 10

if(class==1){
  print('1반입니다')
}else if(class==2){
  print('2반입니다')
}else if(class==3){
  print('3반입니다')
}else{
  print('다시 반 번호를을 확인해주시기 바랍니다')
}

else문은 위에 나열된 모든 조건들이 모두 거짓이면 실행된다. 보통 else if문과 함께 사용되는 경우가 많으며, 어떤 특정 조건에 대한 실행문이 실행되는것이 아니기때문에 else문의 경우 조건식은 적지 않고 실행문만 적는다.
 
 
if~if

#if ~ if
my_age <- 20

if(my_age>=20){
  print('성인입니다')
}

if(my_age>=17){
  print('고등학생입니다')
}
#서로 다른 조건문이기때문에 참으로 인식되는 if문 두개가 전부다 출력됨

if~if은 하나의 조건문이 아니라 서로 각각 다른 if문이다. 만약 if문에 적힌 조건이 전부 참이라면 if문으로 나열된 여러 조건문들이 전부 출력된다.
 

조건문 실습

#============조건문 실습===========#

#<실습>
#1.홀짝 판별하는 
#정수를 저장하는 변수 생성 후
#변수에 저장된 정수가 홀수인지 짝수인지 판별하는 프로그램

num <- 11

if(num%%2==0){
  print('짝수입니다')
}else if(num%%2==1){
  print('홀수입니다')
}


#2.배수판별
#정수를 저장하는 변수 생성 후, 
#저장된 값이 4와5의 배수라면 변수에 저장된값 그대로 출력
#그게 아니라면 0을 출력

num1 <- 21

if(num1%%4==0 & num1%%5==0){
  print(num1)
}else{
  print(0)
}


#3. 나이에 따른 입장료 계산 프로그램 
#10세 이하의 입장료는 1000원
#65세 이상은 0원
#기본입장료는 2000원
#나이, 입장료 출력

age <- 9

if(age<=10){
  price <- 1000
}else if(age>=65){
  print <- 0
}else{
  price <- 2000
}

cat(age,'살의 입장료는 : ',price,'원 입니다')

이미지를 클릭하면 크게볼수 있어요

 

반복문

r에서 반복문은 어떤 작업이 반복적으로 실행되도록 할때 사용한다.
 
반복문 종류

  • while : 조건식이 참일동안만 실행
  • for : 반복가능 객체만큼 실행
  • 이중 for : for문이 다중으로 나열

 

while

#반복문


#while : 조건이 참일동안만 반복하는 반복문
#while(TRUE){#무한 반복문 / 무한 루프}

while(FALSE){
  print('반복문 안의 문장')
}
print('while문 종료') #거짓이기때문에 반복문 밖의 문장 출력

#1~10출력

num <- 1

while(num<=10){
  print(num)
  num <- num+1
}
print('숫자 출력 종료')

while은 조건문이 참일 동안에만 실행되는 반복문이기 때문에 조건식에 무조건 참인 조건식을 적게 되면 반복이 끝나지 않는 무한루프 상태에 빠지게 되며, 이 경우에는 if문과 같은 조건문을 통해 무한루프를 제어해야한다.
 
조건문이 거짓이 되는 때가 존재하는 조건식이 적힌 경우라면 조건문이 거짓이 되면 알아서 반복이 끝나기때문에 따로 종료를 위한 조건을 적거나 할 필요는 없다. 위의 쿼리의 경우에는 1이 저장되어있는 변수를 하나 만들고 그 변수를 출력하되, 그때마다 변수에 +1을 하여 반복이 되면서 숫자가 +1씩 증가하도록 했다.
 

while반복문 실습

#============반복문(while) 실습===========#

#<실습>
#1시부터 시작해서 7시가 되면 알람이 울리는 프로그램 만들기
#while문 사용
#<출력결과>
#1시
#2시
#...
#7시가 되었습니다 알람이 울립니다

#<방법1>wile 조건식 사용
time <- 1

while(time<=6){
  cat(time,'시\n')
  time <- time+1
}
cat(time,'시가 되었습니다. 알람이 울립니다.')


#<방법2>무한반복 사용

time <- 1

while(TRUE){
  if(time <=6)
  cat(time,'시\n')
  else
    break
  time <- time+1
}
cat(time,'시 가 되었습니다. 알람이 울립니다.')

 
 

for문

#for
#for : 범위나 횟수가 정해져있는 동안 반복해서 실행
#for(변수 in 집합){반복할 문장}

for(i in 1:10){
  print(i) #한번 반복할때마다 i가 반복될 수 있도록 함
}


#반복횟수로 이용
for(i in 1:3){
  print('안녕!')
} #반복되는 객체가 저장된 변수를 출력하는것이 아니라면
# for는 반복되는 객체의 수 만큼 해당 문장을 반복해서 보여줌

반복문 for문은 범위나 횟수가 정해져있는 반복가능 객체가 끝날때 까지 실행된다. for문은 ()괄호안의 조건식 안에서 변수를 자정해야하는데 i(변수) in 반복가능객체 의 형식으로 적은후 {}안의 실행문에서 i를출력하는 방식으로 실행된다.
for문의 경우 반복가능 객체가 반복되는 만큼의 횟수를 반복횟수로 사용할 수도 있는데 반복되는 객체가 저장된 변수 i를 출력하는 것이 아니라면 for문은 반복되는 객체의 수 만큼 해당 문장을 반복해서 보여준다.
 

for문 실습

#============반복문(for) 실습===========#

#<실습>
#1) 1~20까지 출력
for(i in 1:20){
  print(i)
}


#2)20~1까지 출력
for(i in 20:1){
  print(i)
}

for(i in seq(20,1,-1)){ #20부터 1까지인데 간격이 -1이기때문에
  #20에서 하나씩 줄어들며 1까지 도달
  print(i)
}


#3) 10~30까지 출력하는데 짝수만 출력
for(i in 10:30){
  if(i%%2==0){
    print(i)
    }
}

for(i in seq(10,30,2)){ #10에서 30까지 도달하는데 간격을 2씩주어
  #if문 없이도 seq를 통해 짝수만 출력될 수 있도록 함.
   print(i)
}


#4) 구구단 7단 출력
#출력 예시
#7 X 1 =7

for(i in 1:7){
  cat(7,'x',i,'=',7*i,'\n')
}


#5)1~20까지 3의 배수 합 출력

result <- 0

for(i in 1:20){
  if(i%%3==0){
    result <- result+i
    print(result)
  }
}
cat('1~20까지의 숫자 중 3의 배수 합계 :', result)

 
 

 
 

for문의 데이터프레임 활용

for반복문을 이용하여 데이터프레임 요소 가져오기

#반복문 활용(데이터 프레임)
df <- data.frame(
  name=c('짱구','철수','유리'),
  score=c(60,90,80)
)

print(df)


#반복문으로 score열 데이터 가져오기
for(i in 1:length(df$score)){
  print(df$score[i])
} #데이터 프레임명[인덱스 번호] 길이때문에 3까지 나오게 되는데
#인덱스 번호로 활용하여 출력한것

for문을 이용하면 데이터프레임의 요소값을 쉽게 가져올 수 있다. for문의 반복객체의 값으로 데이터프레임의 요소의 길이를 주면 되는데, 만약 요소의 길이가 3이라면 1:3이 되므로 변수 i는 1부터 3을 출력하게된다. 이 변수i를 인덱스번호로 사용하여 해당값을 출력하는데 사용하는 것이다. 
 
반복문을 통해 데이터프레임에 새로운 열 추가

#반복문을 통해 데이터프레임에 새로운 열 추가
#70점 이상이면 합격 아니면 불합격 = is_test 열추가

is_pass <- c()

for(i in 1:length(df$score)){
  if(df$score[i]>=70){
    is_pass[i] <- '합격'}
  else{
     is_pass[i] <- '불합격'
}
}

print(is_pass)


#is_test에 is_pass문 추가하기
df$is_test <- is_pass
print(df)

먼저 값을 저장할 빈 벡터를 하나 만들어준다음 위와 같은 방법으로 i를 인덱스번호로 사용하는데, 이때 if의 조건문을 주어 만약 참이라면 참에 해당하는 값이 빈 벡터에 형성되고 거짓이라면 거짓에 해당하는 값이 빈 벡터에 형성되도록 한 후, 열을 추가하는 방법으로 데이터프레임에 열을 추가하면 반복문으로 통해 쉽게 새로운 열을 만들고 추가할 수 있다.
 
 

이중for문

#이중 반복문
for(i in 1:3){
  for(j in 1:3){
    cat('i=',i,'j=',j,'\n')
  }
}

이중 반복문은 for문안에 for문이 한번더 등장하는 형식의 반복문이다. 이 경우 첫번째 for문에 적힌 반복가능 객체는 두번째 반복문이 끝날때까지 한번만 실행되어 같은 값이 실행된다. 
 
 

이중for문 실습

#============이중 반복문(for) 실습===========#

#<실습> 구구단 출력 (2~9단까지 구구단 출력)
#2X1=2...

for(i in 2:9){
  cat('===',i,'단===\n')
  for(j in 1:9){
    cat(i,'x',j,'=',i*j,'\n')
  }
}

 
 
 

기타 제어문

break문

#기타 제어문
#break : 해당 중괄호 영역을 즉시 탈출
#1~10까지 숫자 중 5까지만 출력하기

for(i in 1:10){
  print(i)
  if(i==5){
    break #for문의 중괄호 영역탈출
  }
}

#10까지만 출력
for(i in 1:20){
  if(i==10){
    break
  }
  print(i)
}

break문은 강제로 반복문을 중지하며 탈출하는 제어문이다. 위의 쿼리에서 break문이 없었다면 1부터 20까지 출력되어야 하지만 변수 i가 10이라면 break를 만나도록 하는 조건문이 걸려있기때문에 9까지 출력된것을 볼 수 있다. 보통 이런 break는 무한 루프와도 함께 사용되는 경우가 많다.
 
next문

#next문 : 다음 반복문으로 넘어간다
#1~10까지 숫자 중 5를 제외하고 출력

for(i in 1:10){
  if(i==5){
    next
  }
  print(i)
}



#짝수를 제외하고 홀수만 출력
for(i in 1:30){
  if(i%%2==0){
    next
  }
  print(i)
}

next는 해당 반복문안에서 건너뛰고 싶은 값이 있다면 출력되지 않도록 하고 반복가능객체나 값이 끝까지 출력되도록 하는 제어문이다. next의 경우도 마찬가지로 if문과 함께 사용되어 값이 next를 만나면 값이 건너뛰어질 수 있도록 하는데 break문과 다른점은 next문은 꼭 next가 걸려있는 조건문밑에 값이 출력되는 출력문을 적어야한다는것이다. break의 경우 먼저 값이 출력이되도 알아서 멈추는 형식이기때문에 내가 멈추고 싶은 값 전에 멈출지, 멈추고싶은 값이 출력된후 멈출지에대한 차이점정도여서 상관없지만 next의 경우 print의 출력문이 next문의 위에 존재한다면 건너뛰고싶은 값이 먼저 출력된 후 if조건문 안으로 들어가기때문에 next를 만나서 건너뛴다 하더라도 이미 위에서 출력이 된 후라 원하는 값이 출력되지 않을 수 있기때문에 next의 경우에는 꼭 출력문을 밑에 적어야한다.
 


 

학습일기


 오늘은 r의 제어문들에 대해서 학습했다. 파이썬에서 사용하는 제어문들과 큰 차이점(next가 countinue라는것빼고)이 없어서 어렵진않았는데 r에서 for반복문을 가지고 데이터프레임의 인덱스번호로 사용한다는점은 신기하면서도 for문을 단순 반복문으로만 사용하는것보다 어떻게 활용하느냐가 중요하다는것을 알게되었다.
그리고 아직 이중for문 사용할때 쿼리가 약간 길어지면 조금 헷갈리는부분들이 있어서 이런점만 유의하여 공부하면될것같다!!