R

R 조건제어문, 반복문

Positive_Monster 2022. 1. 13. 23:38
더보기

▣ 주요 키워드

  1. 조건 제어문
    • if, ifelse
  2. 반복문
    • for, while, repeat
      • next, break

★ 조건제어문

- 조건의 흐름을 제어

 

▶ 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

1
2