1. for 문 반복문에서 for문은 반복 횟수를 정할 수 있습니다. > 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 반복문에서 while문은 for문과 다르게 시작 값의 정의와 증가시킬 값(반복변수 증가 구문)이 필요합니다. > 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를 사용하여 반복문을 벗어나려는 목적으로 사용합니다. > 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 문장 수행 시
# exit는 강제 프로그램 종료(엄청난 interrupt 발생 시) # 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 값 그대로 출력 > 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 |