티스토리 뷰
반복문
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 캠퍼스 머신러닝기반의 빅데이터분석 양성과정
'R > Process' 카테고리의 다른 글
[R] 정규 표현식 - 정규 표현식을 사용한 데이터 추출 (0) | 2019.01.02 |
---|---|
[R] 문자열 관련 함수 - stringr 패키지, 정규식 (1) | 2019.01.01 |
[R] 조건문 - if, else if, ifelse (0) | 2018.12.31 |
[R] 데이터 타입 변환 함수 (0) | 2018.12.27 |
[R] 데이터 프레임(date frame) (0) | 2018.12.27 |