[Rプログラミング]検索条件文、繰り返し文、関数/データ位置


📌 条件文
📖 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(반복 변수 in 반복 범위) {
    	반복할 명령문(들)
    }
    ✔黙認門
    > 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
    ✔繰り返し変数を使用したgugudan出力
    > 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 
    ✔文に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
    花の葉の長さによってアヤメを分類する
    > 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(비교조건){
    	반복할 명령문(들)
    }
    > 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
    📌 n.関数
    ✔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人の学生の成績を格納するベクトルがあり、最も成績の良い学生が何位にあるかを知りたい場合は、
  • です.
  • この場合、便利に使用できる関数は次のとおりです.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)