R
R 조건제어문, 반복문
Positive_Monster
2022. 1. 13. 23:38
더보기
▣ 주요 키워드 ▣
- 조건 제어문
- if, ifelse
- 반복문
- for, while, repeat
- next, break
- for, while, repeat
★ 조건제어문
- 조건의 흐름을 제어
▶ if문
if(조건){
조건에 참일 때 수행
}
if(조건){
조건에 참일 때 수행
} else{
조건에 거짓일 때 수행
}
if(TRUE){
print('참')
}
if(FALSE){
print('참')
} else{
print('거짓')
}
x <- 100
y <- 200
if(x==y){
print('x와 y가 같다')
} else{
if(x>y){
print('x가 y보다 크다')
} else{
print('y가 x보다 크다')
}
}
x <- 100
y <- 200
if(x==y){
print('x와 y가 같다')
} else if(x>y){
print('x가 y보다 크다')
} else{
print('y가 x보다 크다')
}
x <- 2
if(x%%2==0){
print('2의 배수')
} else{
print('2의 배수가 아니다')
}
#2의 배수이면 '2의 배수', 아니면 '2의 배수가 아니다' 출력
※ readline
if(as.numeric(readline('insert please : '))%%2==0){
print('2의 배수')
} else{
print('2의 배수가 아니다')
}
#직접 변수 입력
▶ ifelse
ifelse(조건,참,거짓)
ifelse(조건,참,ifelse(조건,참,ifelse(조건,참,거짓)))
x <- 1
y <- 2
ifelse(x==y,'같다','다르다')
ifelse(x==y,'같다',ifelse(x>y,'x가 크다','y가 크다'))
x <- 2
ifelse(x%%2==0, '2의 배수','2의 배수가 아니다')
#1부터 100까지의 수 중 짝수값은 10을 곱한 값으로 수정
x <- c(1:100)
ifelse(x%%2==0,x*10,x)
x <- c(2,10,6,4,3,NA,7,9,1)
ifelse(is.na(x),0,x)
ifelse(!is.na(x),x,0)
# na값을 0 나머지는 그대로 출력
1.
g <- ifelse(is.na(employees$COMMISSION_PCT),
employees$SALARY*12,
(employees$SALARY*12)+(employees$SALARY*12*employees$COMMISSION_PCT))
x <- employees[,c('LAST_NAME','SALARY','COMMISSION_PCT')]
x$계산값 <-g
x
#na값이 commission_pct에 있을경우 2번째 줄 시행, 없을경우 3번째 줄 시행
2.
df <- data.frame(name = employees$LAST_NAME,
sal = employees$SALARY,
com = employees$COMMISSION_PCT,
ann_sal = ifelse(is.na(employees$COMMISSION_PCT),
employees$SALARY*12,
(employees$SALARY*12)+(employees$SALARY*12*employees$COMMISSION_PCT))
)
df[order(df$ann_sal,decreasing = T),] #정렬
doBy::orderBy(~-ann_sal,df) #정렬
#na값이 commission_pct에 있을경우 2번째 줄 시행, 없을경우 3번째 줄 시행
df <- data.frame(name = employees$LAST_NAME,
sal = employees$SALARY,
level = ifelse(employees$SALARY >= 10000, 'A',
ifelse(employees$SALARY >=5000 & employees$SALARY < 10000,'B','C')))
df
doBy::orderBy(~level+sal,df)
#급여가 10000이상 A, 5000이상 10000미만 B, 나머지 C 컬럼 이름을 name, sal,level로 설정
▶ switch
- 변숫값에 따라 조건에 맞는 실행문을 수행하는 함수
x <- 2
switch(x,'남은 기간 최선을 다하자', '행복하자', '건강하게 살자')
switch(1,'남은 기간 최선을 다하자', '행복하자', '건강하게 살자')
switch(3,'남은 기간 최선을 다하자', '행복하자', '건강하게 살자')
# x값이 2로 초기화 시켜주고 switch문에서 x(2)값을 추출하면 두번째 위치인 '행복하자'가 출력
switch(x,1위치,2위치,3위치,4위치.....)
x<- '산'
switch(x,'산' = '한라산 가고 싶다',
'바다' = '함덕해수욕장 가고 싶다.',
paste0(x,'그냥 방콕하세요'))
# switch(선택할 키워드,키워드 = 출력값, 키워드2 = 출력값2...)
x<- '강'
switch(x,'산' = '한라산 가고 싶다',
'바다' = '함덕해수욕장 가고 싶다.',
paste0(x,'그냥 방콕하세요'))
★ 반복문
▶ for 문
for(카운터변수 in 반복수행할 데이터 변수){
반복수행할 문장
}
x <- 1:100
x
for(i in x){ # 1부터 100까지 출력
print(i)
}
for(i in 1:100){
print("오늘 하루도 행복하자") #오늘 하루도 행복하자 100번 출력
}
x <- c('바다','강','계곡','산')
x
for (i in x){ # 벡터값들 출력
print(i)
}
x <- c(-1,1,2,3)
for(i in x){
if(i < 0){
print('음수')
} else{
print('양수')
}
}
● 1부터 10까지 합
hap <- 0
for(i in 1:10){
hap <- hap + i
}
hap
● 1부터 100까지 전체합, 짝수합, 홀수합
sum_even <- 0
sum_odd <- 0
sum_total <- 0
1.if
for(i in 1:100){
sum_total <- sum_total + i
if(i%%2==0){
sum_even <- sum_even + i
} else{
sum_odd <- sum_odd + i
}
}
sum_total
sum_even
sum_odd
2.ifelse
for(i in 1:100){
sum_total <- sum_total + i
ifelse(i%%2==0,sum_even<- sum_even +i, sum_odd <- sum_odd+i)
}
●1부터100까지 홀수만 x변수에 입력
1.
x <- seq(1,100,2)
2.
x <- NULL
for(i in 1:100){
if(i%%2 != 0){
x[i] <- i
}
}
x[!is.na(x)]
3.
x <- NULL
for(i in 1:100){
if(i%%2 != 0){
x <- c(x,i)
}
}
x
4.
x <- NULL
for(i in 1:100){
if(i%%2 != 0){
x <- append(x,i)
}
}
x
● 1부터 10까지 출력. 3,5제외
x <- 0
for(i in 1:10){
if(i!=3 & i!=5){
x[i] <-i
}
}
x
x[!is.na(x)]
2.
for(i in 1:10){
if(i == 3 | i == 5){
NULL
} else{
print(i)
}
}
3.
# next 함수 : 현재 수행중인 반복문을 중지하고 다음 반복문으로 넘어가는 함수 (NULL이나 NA가 아님)
for(i in 1:10){
if(i == 3 | i == 5){
next
} else{
print(i)
}
}
# break 함수 : 반복문 종료
for(i in 1:10){
if(i == 3 | i == 5){
break
} else{
print(i)
}
}
● next 함수
- 현재 수행 중인 반복문을 중지하고 다음 반복문으로 넘어가는 함수(NULL이나 NA가 아님)
● break 함수
-반복문 종료
● 구구단(2단)
x<-2
for(i in 1:9){
print(paste('2 x',i,'=',x*i))
}
2.
2*1:9
3.
x <- 1:9
x*2
paste('2 *',1:9,'=',2*1:9)
print('2 * ',1,'=',2) # 콤마로 구분이 되어 있는 각각의 값들을 출력할 수 없다.
print(paste('2 *',1:9,'=',2*1:9)) # 콤마로 구분이 되어있는 부분을 paste를 이용해서 하나로 붙여서 출력
cat('2 * ',1,'=',2) # 콤마로 구분이 되어 있는 각각의 값들을 출력할 수 있다.
for(i in 1:9){
cat('2 *',i,'=',2*i, '\n') # '\n'(개행문자) <- 다음줄로 넘어가는 역할할
}
cat(paste('2 *',1:9,'=',2*1:9,'\n'))
● 구구단 출력
1.
for(i in 2:9){
for(j in 1:9){
print(paste(i,'x',j,'=',i*j))
}
}
for (i in 2:9){
for(j in 1:9){
cat(i,' * ',j,' = ',i*j,'\n')
}
}
2. 행별로 구구단
for (i in 2:9){
for(j in 1:9){
cat(i,' * ',j,' = ',i*j,'\t')
}
cat('\n')
}
3. 열별로 구구단
for(i in 1:9){
for(j in 2:9){
cat(j, 'x', i, '=',j*i, '\t') #cat 함수 : print의 강화버전.cat() '\n'->엔터, '\t' -> tab
}
cat('\n')
}
▶while문
- 조건이 TRUE인 동안 반복 수행하고 조건이 FALSE면 반복문을 종료하는 반복문
while(조건){
반복수행할 문장
}
for(i in 1:10){
print(i)
}
i<- 1
while(i<=10){
print(i)
i<- i+1
}
● while 문의 구구단
i<-2
while(i<=9){
j <- 1
while(j<=9){
print(paste(i,'*',j,'=',i*j))
j <- j + 1
}
i <- i + 1
}
i<-2
while(i<=9){
j <- 1
while(j<=9){
cat(i,'*',j,'=',i*j,'\n')
j <- j + 1
}
i <- i + 1
}
i <- 1
while(i<=9){
j <- 2
while(j<=9){
cat(j,'*',i,'=',j*i,'\t')
j <- j + 1
}
i <- i + 1
cat('\n')
}
▶ repeat
- 조건이 없는 상태에서 반복
repeat{
반복수행할 문장
break
}
#1부터10까지
i <- 1
repeat{
print(i)
if(i==10){
break
}
i <- i +1
}
● repeat에서 구구단
1.세로
i<-2
repeat{
if(i==10){
break
}
j <-1
repeat{
if(j==10){
break
}
cat(i,'*',j,'=',i*j,'\n')
j <- j+1
}
i <- i+1
}
2.가로
i <- 1
repeat{
if(i==10){
break
}
j <-2
repeat{
if(j==10){
break
}
cat(j,'*',i,'=',i*j,'\n')
j <- j+1
}
cat('\n')
i <- i+1
}
●보너스 문제
구구단을 DATAFRAME에 저장하기. 각각 단이 컬럼으로 구성 되도록 해보기
m <- NULL
for(i in 2:9){
temp <- NULL
for(j in 1:9){
temp <- c(temp,paste(i,'x',j,'=',i*j))
}
m <- cbind(m,temp) #컬럼결합
}
m
gugudan <- data.frame(m)
gugudan
names(gugudan) <- c('1단','2단','3단','4단','5단','6단','7단','8단','9단')
n <- NULL
for(i in 2:9){
n <- c(n,paste0(i,'단'))
}
n
names(gugudan)<- n
gugudan