[R프로그래밍] 조건문, 반복문, 함수 / 데이터 위치 찾기

·2021년 10월 18일
0

[R프로그래밍]

목록 보기
5/7

📌 조건문

📖 if-else문

  • 조건절에 따라 특정 명령을 실행하도록 하는 프로그래밍 명령문
  • 조건에 따라 실행할 명령문을 달리해야 하는 경우 사용
  • if-else문의 기본 문법
if(비교조건){
	조건이 참일 때 실행할 명령문(들)
} else {
	조건이 거짓일 때 실행할 명령문(들)
}

✔ 기본 if-else문

> job.type <- 'A'

> if(job.type=='B'){ 
+     bonus <- 200 #직무 유형이 B일  실행
+ } else {
+     bonus <- 100 #직무 유형이 B가 아닌 나머지 경우 실행
+ }

> print(bonus)
[1] 100

✔ else가 생력된 if문

> job.type <- 'B'
> bonus <- 100

> if(job.type=='A'){
+     bonus <- 200 #직무 유형이 A일  실행
+ }

> print(bonus)
[1] 100

✔ 다중if-else문

> score <- 85

> if(score>90){
+     grade <- 'A'
+ } else if(score>80){
+     grade <- 'B'
+ } else if(score>70){
+     grade <- 'C'
+ } else if (score>60){
+     grade <- 'D'
+ } else {
+     grade <- 'F'
+ }

> print(grade)
[1] "B"

✔ 조건문에서 논리 연산자의 사용

  • if문에 논리 연산자를 사용하면 복잡한 조건문을 서술 가능
  • 대표적인 논리연산자는 &(and)와 |(or)
> a <- 10
> b <- 20

> if(a>5 & b>5){ #and 사용
+     print(a+b)
+ }
[1] 30

> if(a>5 | b>30){ #or 사용
+     print(a*b)
+ }
[1] 200

📖 ifelse문

조건에 따라 둘 중 하나의 값 또는 변수를 선택할 때 사용

> a <- 10
> b <- 20
> if(a>b){
+     c <- a
+ } else{
+     c <- b
+ }
> print(c)
[1] 20

> a <- 10
> b <- 20
> c <- ifelse(a>b, a, b)
> print(c)
[1] 20

📌 반복문

📖 for문

  • 반복문은 정해진 동작을 반복적으로 수행할 때 사용하는 명령문
  • 동일 명령문을 여러 번 반복해서 실행할 때 사용
for(반복 변수 in 반복 범위) {
	반복할 명령문(들)
}

✔ 기본 for문

> for(i in 1:5){
+     print('*')
+ }
[1] "*"
[1] "*"
[1] "*"
[1] "*"
[1] "*"

✔ 반복 범위에 따른 반복 변수의 값 변화

> for(i in 6:10){
+     print(i)
+ }
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

✔ 반복 변수를 이용한 구구단 출력

> for(i in 1:9){
+     cat('2 *',i,'=',2*i,'\n')
+ }
2 * 1 = 2 
2 * 2 = 4 
2 * 3 = 6 
2 * 4 = 8 
2 * 5 = 10 
2 * 6 = 12 
2 * 7 = 14 
2 * 8 = 16 
2 * 9 = 18 

✔ for문 안에서 if문의 사용

> for(i in 1:20){
+     if(i%%2==0){ #짝수인지 확인
+         print(i)
+     }
+ }
[1] 2
[1] 4
[1] 6
[1] 8
[1] 10
[1] 12
[1] 14
[1] 16
[1] 18
[1] 20

✔ 1~100 사이의 숫자 합 출력

> sum <- 0
> for(i in 1:100){
+     sum <- sum+i
+ }
> print(sum)
[1] 5050

✔ iris에서 꽃잎의 길이에 따른 분류 작업

> norow <- nrow(iris) #iris의 행의 
> mylabel <- c() #비어있는 벡터 선언
> for(i in 1:norow){
+     if(iris$Petal.Length[i]<=1.6){ #꽃잎의 길이에 따라 레이블 결정
+         mylabel[i] <- 'L'
+     } else if(iris$Petal.Length[i]>=5.1){
+         mylabel[i] <- 'H'
+     } else{
+         mylabel[i] <- 'M'
+     }
+ }
> print(mylabel) #레이블 출력
  [1] "L" "L" "L" "L" "L" "M" "L" "L" "L" "L" "L" "L" "L" "L" "L" "L" "L"
 [18] "L" "M" "L" "M" "L" "L" "M" "M" "L" "L" "L" "L" "L" "L" "L" "L" "L"
 [35] "L" "L" "L" "L" "L" "L" "L" "L" "L" "L" "M" "L" "L" "L" "L" "L" "M"
 [52] "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M"
 [69] "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "H" "M"
 [86] "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "H" "H"
[103] "H" "H" "H" "H" "M" "H" "H" "H" "H" "H" "H" "M" "H" "H" "H" "H" "H"
[120] "M" "H" "M" "H" "M" "H" "H" "M" "M" "H" "H" "H" "H" "H" "H" "H" "H"
[137] "H" "H" "M" "H" "H" "H" "H" "H" "H" "H" "M" "H" "H" "H"
> newds <- data.frame(iris$Petal.Length, mylabel) #꽃잎의 길이와 레이블 출력
> head(newds) 
  iris.Petal.Length mylabel
1               1.4       L
2               1.4       L
3               1.3       L
4               1.5       L
5               1.4       L
6               1.7       M

📖 while문

while문은 어떤 조건이 만족하는 동안 코드블록을 수행하고, 해당 조건이 거짓일 경우 반복을 종료하는 명령문

while(비교조건){
	반복할 명령문(들)
}
> sum <- 0
> i <- 1
> while(i<=100){
+     sum <- sum+i
+     i <- i+1
+ }
> print(sum)
[1] 5050

📖 break와 next

✔ break

> sum <- 0
> for(i in 1:10){
+     sum <- sum+i
+     if(i>=5) break
+ }
> sum
[1] 15

✔ next

> sum <- 0
> for(i in 1:10){
+     if (i%%2==0) next
+     sum <- sum+i
+ }
> sum
[1] 25

📌 함수

✔ apply() 함수

  • 반복 작업이 필요한 경우에는 반복문 적용
  • 반복 작업의 대상이 매트릭스나 데이터프레임의 행 또는 열인 경우는 for문이나 while문 대신에 apply() 함수를 이용할 수 있음

apply() 함수의 문법

apply(데이터셋, 행/열방향 지정, 적용함수)
> apply(iris[,1:4],1, mean) #row방향으로 함수 적용
  [1] 2.550 2.375 2.350 2.350 2.550 2.850 2.425 2.525 2.225 2.400 2.700
 [12] 2.500 2.325 2.125 2.800 3.000 2.750 2.575 2.875 2.675 2.675 2.675
 [23] 2.350 2.650 2.575 2.450 2.600 2.600 2.550 2.425 2.425 2.675 2.725
 [34] 2.825 2.425 2.400 2.625 2.500 2.225 2.550 2.525 2.100 2.275 2.675
 [45] 2.800 2.375 2.675 2.350 2.675 2.475 4.075 3.900 4.100 3.275 3.850
 [56] 3.575 3.975 2.900 3.850 3.300 2.875 3.650 3.300 3.775 3.350 3.900
 [67] 3.650 3.400 3.600 3.275 3.925 3.550 3.800 3.700 3.725 3.850 3.950
 [78] 4.100 3.725 3.200 3.200 3.150 3.400 3.850 3.600 3.875 4.000 3.575
 [89] 3.500 3.325 3.425 3.775 3.400 2.900 3.450 3.525 3.525 3.675 2.925
[100] 3.475 4.525 3.875 4.525 4.150 4.375 4.825 3.400 4.575 4.200 4.850
[111] 4.200 4.075 4.350 3.800 4.025 4.300 4.200 5.100 4.875 3.675 4.525
[122] 3.825 4.800 3.925 4.450 4.550 3.900 3.950 4.225 4.400 4.550 5.025
[133] 4.250 3.925 3.925 4.775 4.425 4.200 3.900 4.375 4.450 4.350 3.875
[144] 4.550 4.550 4.300 3.925 4.175 4.325 3.950

> apply(iris[,1:4],2,mean) #col 방향으로 함수 적용
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
    5.843333     3.057333     3.758000     1.199333 

✔ 사용자 정의 함수 만들기

  • R은 사용자들도 자신만의 함수를 만들어 사용할 수 있는 기능을 제공하는데, 이를 사용자 정의 함수라고 함

사용자 정의 함수 문법

함수명 <- function(매개변수 목록){
	실행할 명령문(들)
    return(함수의 실행 결과)
]
mymax <- function(x,y){
+     num.max <- x
+     if(y>x){
+         num.max <- y
+     }
+     return(num.max)
+ }

✔ 만든 사용자 정의 함수 사용하기

> mymax(10,15)
[1] 15

> a <- mymax(20,15)
> b <- mymax(31,45)
> print(a+b)
[1] 65

✔ 사용자 정의 함수의 매개변수에 초기값 설정하기

> mydiv <- function(x,y=2){
+     result <- x/y
+     return(result)
+ }

> mydiv(x=10,y=3) #매개변수 이름과 매개변수값을 쌍으로 입력
[1] 3.333333
> mydiv(10,3) #매개변수값만 입력
[1] 3.333333

> mydiv(10) #x에 대한 값만 입력 (y값이 생략됨)
[1] 5

✔ 함수가 반환하는 결과값이 여러 개일 때의 처리

> myfunc <- function(x,y){
+     val.sum <- x+y
+     val.mul <- x*y
+     return(list(sum=val.sum, mul=val.mul))
+ }

> result <- myfunc(5,8)
> s <- result$sum
> m <- result$mul
> cat('5+8=',s,'\n')
5+8= 13 
> cat('5*8=',m,'\n')
5*8= 40

✔ 사용자 정의 함수의 저장 및 호출

> setwd("c:/source")
> source("myfunc.R")

> a <- mydiv(20,4)
> b <- mydiv(30,4)

> a+b
[1] 12.5
> mydiv(mydiv(20,2),5)
[1] 2

📌 조건에 맞는 데이터의 위치 찾기

  • 데이터 분석을 하다보면 자신이 원하는 데이터가 벡터나 매트릭스, 데이터프레임 안에서 어디에 위치하고 있는지를 알기 원하는 때가 있음
  • 예를 들어, 50명의 학생 성적이 저장된 벡터가 있는데 가장 성적이 좋은 학생은 몇 번째에 있는지를 알고 싶은 경우
  • 이런 경우 편리하게 사용할 수 있는 함수가 which(), which.max(), which.min()함수
> score <- c(76,84,69,50,95,60,82,71,88,84)
> which(score==69) #성적이 69인 학생은 몇 번째에 있나
[1] 3

> which(score>=85) #성적이 85 이상인 학생은 몇 번째에 있나
[1] 5 9

> max(score) #최고 점수는 몇 점인가
[1] 95
> which.max(score) #최고 점수는 몇 번째에 있나
[1] 5

> min(score) #최저 점수는 몇 점인가
[1] 50
> which.min(score) #최저 점수는 몇 번째에 있나
[1] 4
> score <- c(76,84,69,50,95,60,82,71,88,84)
> idx <- which(score<=60) #성적이 60이하인 값들의 인덱스
> score[idx] <- 61 #성적이 60 이하인 값들은 61점으로 성점 상향 조정
> score
 [1] 76 84 69 61 95 61 82 71 88 84
 
> idx <- which(score>=80) #성적이 80이상인 값들의 인덱스
> score.high <- score[idx] #성적이 80 이상인 값들만 추출하여 저장
> score.high
[1] 84 95 82 88 84
> idx <- which(iris$Petal.Length>5.0) #꽃잎의 길이가 5.0 이상인 값들의 인덱스
> idx
 [1]  84 101 102 103 104 105 106 108 109 110 111 112 113 115 116 117 118
[18] 119 121 123 125 126 129 130 131 132 133 134 135 136 137 138 140 141
[35] 142 143 144 145 146 148 149 150

> iris.big <- iris[idx,] #인덱스에 해당하는 값만 추출하여 저장
#1~4열의 값 중 5보다 큰 값의 행과 열의 위치
> idx <- which(iris[,1:4]>5.0, arr.ind=TRUE)
profile
╰(⊡-⊡)و✎⮹

0개의 댓글