티스토리 뷰

반응형


반복문

 


반복문의 단짝 조건문
[R] 조건문 - if, else if, ifelse




 1. for 문

반복문에서 for문반복 횟수를 정할 수 있습니다.


for(반복변수 in 횟수) { 

      반복할 식 

}


> for (i in c(1:5)) {         # 숫자의 개수만큼 벡터의 요소를 i에 넣고 출력

+   print(i)

+ }

[1] 1

[1] 2

[1] 3

[1] 4

[1] 5

> for (i in c('a','b','c')) {    # 문자의 개수만큼 벡터의 요소를 i에 넣고 출력

+   print(i)

+ }

[1] "a"

[1] "b"

[1] "c"

> for (i in c('a','b','c')) {      # 문자의 개수만큼 반복 

+   print(10)

+ }  

[1] 10

[1] 10

[1] 10

> for (i in emp$SAL) {       # emp테이블의 SAL column의 row 개수만큼 반복(반복 대상을 반복변수에 하나씩 넣으면서 반복)

+   print(i * 0.1)               # 반복 변수를 재사용해서 반복문을 완성 

+ }

[1] 80

[1] 160

[1] 125

[1] 297.5

[1] 125

[1] 285

[1] 245

[1] 300

[1] 500

[1] 150

[1] 110

[1] 95

[1] 300

[1] 130

> vec1 <- c(10,20,30)

> for (i in vec1){                # for문과 if문의 조합

+   if (i == 10) {       

+     print('인사부')

+   } else {

+     print('총무부')

+   }

+ }

[1] "인사부"

[1] "총무부"

[1] "총무부"



# Q. emp에서 sal이 2000이상일 경우는 연봉 인상률이 10%, 2000미만일 경우는 15%로 계산

> for (i in emp$SAL) {

+   if (i >= 2000) {       

+     print(i * 1.1)

+   } else {

+     print(i * 1.15)

+   }

+ }

[1] 920

[1] 1840

[1] 1437.5

[1] 3272.5

[1] 1437.5

[1] 3135

[1] 2695

[1] 3300

[1] 5500

[1] 1725

[1] 1265

[1] 1092.5

[1] 3300

[1] 1495





 2. while 문

반복문에서 while문은 for문과 다르게 시작 값의 정의와 증가시킬(반복변수 증가 구문) 필요합니다.


var <- 시작 값 정의

while(조건) { 

     반복할 식 

     증가 구문

}

 

 > i <- 1

> while( i<=5 ) {    특정 조건이 맞을 때 까지 반복, 항상 True면 무한 루프에 빠지므로 주의

+   print(i)

+   i <- i + 1

+ }

[1] 1

[1] 2

[1] 3

[1] 4

[1] 5





 3. while 문 - next


반복문 while문 next는 현재 수행 중인 반복문 블록을 중단하고, 다음 반복을 시작합니다.

특정 조건에서 반복할 식을 넘어가고 싶다면 next를 사용하면 됩니다.


# 특정 조건이 성립할 때 뒤의 명령어를 수행하지 않고(뒤는 무시), while문의 처음으로 돌아감. 

> i <- 1

> while(i<=10) {

+   i <- i + 1

+   if(i %% 2 != 0) {     # i가 홀수일 경우 뒤의 명령어(print(i))를 무시하고 while문의 처음(i<-i+1)으로 돌아갑니다.

+     next

+   }

+   print(i)

+ }

[1] 2

[1] 4

[1] 6

[1] 8

[1] 10





4. repeat


반복문에서 repeat블록 안의 문장을 반복해서 수행하다가, 특정 상황에 종료할 때 사용합니다.

for문, while문에 비해 잘 사용하지 않고, 특정 조건이 맞을 때 break를 사용하여 반복문을 벗어나려는 목적으로 사용합니다.

 

repeat

    반복할 식 

}


> i <- 1

> repeat {

+   print(i)

+   i <- i + 1

+   if(i >= 5) {      # i가 5이상일 경우 반복문 종료  

+     break

+   }

+ }

[1] 1

[1] 2

[1] 3

[1] 4





5. next, break, exit 비교


# 1. next 문장 수행 시 

# next는 현재 수행 중인 반복문 블록을 중단하고, 다음 반복을 시작

for ( i in 1:10) {

  cmd1                # i = 1~4 까지 cmd1,2,3 계속 실행. 

  cmd2

  if( 1 == 5 ) {       # i가 5일 때만, cmd3 생략. 다음 반복을 시작

    next   

  }

  cmd3                

}

cmd4                   # 반복문이 종료되면 정상 실행



# 2. break 문장 수행 시
# break는 반복문을 벗어나려는 목적
for ( i in 1:10) {
  cmd1     
  cmd2
  if( 1 == 5 ) {          # i가 5가 되는 순간 반복문 종료, 반복문 내 모든 명령어 무시
    break  
  }        
  cmd3  
}
cmd4                      # 반복문이 종료되면 정상 실행



# 3. exit 문장 수행 시 

# exit는 강제 프로그램 종료(엄청난 interrupt 발생 시)

# exit의 숫자에 의미는 없고. 종료 코드에 따른 연속적인 작업을 수행 시 개발자가 설정
for ( i in 1:10) {
  cmd1    
  cmd2
  if( 1 == 5 ) {          # i가 5가 되는 순간 해당 프로그램 즉시 종료, 프로그램 내 모든 명령어 무시
    exit 0       
  }            
  cmd3
}
cmd4                     # exit를 만나면 프로그램이 종료되므로 실행되지 않음

 

 

 

 

Q.

 

> # emp 데이터를 불러온 후

> emp <- read.csv("emp.csv")

> emp

   EMPNO  ENAME       JOB  MGR        HIREDATE  SAL COMM DEPTNO

1   7369  SMITH     CLERK 7902 1980-12-17 0:00  800   NA     20

2   7499  ALLEN  SALESMAN 7698 1981-02-20 0:00 1600  300     30

...

13  7902   FORD   ANALYST 7566 1981-12-03 0:00 3000   NA     20

14  7934 MILLER     CLERK 7782 1982-01-23 0:00 1300   NA     10



> # 1. empno 컬럼값을 rowname으로 설정

> rownames(emp) <- emp[,1]       # rownames(emp) <- emp$EMPNO

> emp <- emp[,-1]

> emp

      ENAME       JOB  MGR        HIREDATE  SAL COMM DEPTNO

7369  SMITH     CLERK 7902 1980-12-17 0:00  800   NA     20

7499  ALLEN  SALESMAN 7698 1981-02-20 0:00 1600  300     30

...

7902   FORD   ANALYST 7566 1981-12-03 0:00 3000   NA     20

7934 MILLER     CLERK 7782 1982-01-23 0:00 1300   NA     10



> # 2. KING 행 삭제

> emp <- emp[emp$ENAME != 'KING',]       # emp <- emp[!emp$ENAME == 'KING',]



# 3. COMM 컬럼의 값이 NA이면 100, NA가 아니면 COMM 값 그대로 출력
# 1) for + if 사용

> v1 <- c()                             # for문(반복문, 여러개의 값)의 결과를 저장해주기 위해 빈 벡터의 정의가 필요합니다.

> for( i in emp$COMM){           # 결과를 벡터화 

+   if(is.na(i)) {

+     v1 <- c(v1,100)                # i(emp$COMM)가 na일 경우, 빈 벡터 v1에 100으로 저장

+   } else {             

+     v1 <- append(v1,i)           # na가 아닐 경우, i값 그대로 저장

+   }

+ }

> v1

 [1]  100  300  500  100 1400  100  100  100    0  100  100  100  100

# 2) ifelse 사용

# ifelse는 값을 화면에 출력하는 것이 아닌, 바로 값을 return 하면서 벡터화시키므로 컬럼으로 바로 추가 가능합니다.

# for문은 위와 같이 따로 결과를 벡터형태로 만들어줘야하는 번거로움이 있죠.

> emp$comm2 <- ifelse(is.na(emp$COMM),100,emp$COMM)

> emp

      ENAME      JOB  MGR        HIREDATE  SAL COMM DEPTNO comm2

7369  SMITH    CLERK 7902 1980-12-17 0:00  800   NA     20   100

7499  ALLEN SALESMAN 7698 1981-02-20 0:00 1600  300     30   300

...

7902   FORD  ANALYST 7566 1981-12-03 0:00 3000   NA     20   100

7934 MILLER    CLERK 7782 1982-01-23 0:00 1300   NA     10   100



# 4. 각 직원의 deptno값을 확인하여 같은 부서 직원들의 평균 연봉을 각 행마다 출력(컬럼 추가 X, 단순 출력)

# mean() : 평균을 구하는 함수 

> for( i in emp$DEPTNO){

+     print(mean(emp[emp$DEPTNO==i,'SAL']))

+ }

[1] 2175

[1] 1566.667

[1] 1566.667

...

[1] 1566.667

[1] 2175

[1] 1875

# 컬럼에 추가하기 

> v2 <- c()                    for문을 사용하여 결과를 벡터화 시켜주기 위해 빈 벡터를 정의 

> for( i in emp$DEPTNO){

+   v2 <- c(v2,(mean(emp[emp$DEPTNO==i,'SAL'])))

+ }

> v2                             # 벡터화 된 결과

 [1] 2175.000 1566.667 1566.667 2175.000 1566.667 1566.667 1875.000 2175.000 1566.667 2175.000 1566.667 2175.000 1875.000

> emp$AVG_SAL <- v2    # 벡터화 된 결과를 컬럼에 추가

> emp  

      ENAME      JOB  MGR        HIREDATE  SAL COMM DEPTNO comm2  AVG_SAL

7369  SMITH    CLERK 7902 1980-12-17 0:00  800   NA     20   100 2175.000

7499  ALLEN SALESMAN 7698 1981-02-20 0:00 1600  300     30   300 1566.667

7521   WARD SALESMAN 7698 1982-02-22 0:00 1250  500     30   500 1566.667

...

7900  JAMES    CLERK 7698 1981-12-03 0:00  950   NA     30   100 1566.667

7902   FORD  ANALYST 7566 1981-12-03 0:00 3000   NA     20   100 2175.000

7934 MILLER    CLERK 7782 1982-01-23 0:00 1300   NA     10   100 1875.000


 




참고: KIC 캠퍼스 머신러닝기반의 빅데이터분석 양성과정

 

반응형
댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday