내용
제어구문(Control flow)과 사용자정의함수
일반적으로 R 프로그램의 명령문은 프로그램의 상단에서 하단으로 순차적으로 실행됩니다. 그러나 특정 조건이 충족되는 경우에만 다른 명령문을 실행하면서 일부 명령문을 반복적으로 실행할 수 있습니다. 이것이 제어 흐름 구조가 들어오는 곳입니다. 이 제어흐름은 조건을 판단하기 위한 조건문과 유사한 명령을 반복적으로 실행할 수 있는 반복문이 있습니다. R에서 명령을 전달하는 구문을 크게 구분하면 다음과 같습니다.- statement: 단일 문과 복합문이 있습니다. 여러 문들을 같이 입력하는 복합문의 경우 중간괄호('{ }')로 묶여있거나 세미콜론(';')으로 구분합니다.
- cond: true 또는 false로 확인되는 표현식(expression)입니다.
- expr: 숫자 또는 문자열로 평가되는 명령문입니다.
- seq: 일련의 숫자 또는 문자열입니다.
반복문
유사한 명령을 반복하는 문으로 for문과 while 문을 사용합니다.for 문
for (변수 in seq) statement
seq에 포함된 모든 요소들을 사용할 때까지 statement가 지속됩니다.
for (i in 1:5) print(i)
[1] 1 [1] 2 [1] 3 [1] 4 [1] 5
while 문
while (cond) statement
cond 즉, 조건이 FALSE가 될 때까지 statement가 지속됩니다.
i<-0 while(i < 5) { print(i) i<-i+1 }
[1] 0 [1] 1 [1] 2 [1] 3 [1] 4이러한 반복문은 apply 계열의 함수들로 대체할 수 있으며 규모가 큰 데이터의 경우 apply()함수를 사용하는 것이 더 효율적일 수 있습니다.
set.seed(1) x<-matrix(1:100, 10, 10) dim(x)
[1] 10 10
system.time(for (i in 1:10) mean(x[, i]))
사용자 시스템 elapsed 0.01 0.00 0.01
system.time(apply(x, 2, mean))
사용자 시스템 elapsed 0 0 0
조건문
조건의 TRUE, FALSE를 결정하는 문으로 if-else, ifelse, switch 문을 사용할 수 있습니다. 조건문은 원자를 평가합니다. 그러므로 두개 이상의 원자를 갖는 벡터나 다른 구조의 자료에 대해 적용하기 위해서는 반복문 또는 apply 계열의 함수들을 같이 적용하여야 합니다.if ~ else
- if(cond) statement
- 조건이 true이면 statement 실행
- if(cond) statement1 else statement2
- 조건이 true이면 statement1 실행, false이면 statement2 실행
- if(cond1) statement1 else if (cond2) statement2 else statement3
- 조건1이 true이면 statement1 실행, 조건2가 true이면 statement1 실행, 두 조건이 false이면 statement3 실행
x<-sample(c('black', 'white', 'blue', 'green'), 20, replace=TRUE) class(x)
[1] "character"
if(is.character(x)) x<-as.factor(x) class(x)
[1] "factor"
if(!is.factor(x)) x<-as.factor(x) else print('already factor')
[1] "already factor"
score<-35 state<-c() if(score >= 80) { state<-append(state, 'pass') } else if ((score >= 50) & (score < 80)) { state<-append(state, 're-exam') } else { state<-append(state, 'fail') } state
[1] "fail"
set.seed(3) score<-sample(seq(0, 100, 10), 10, replace=TRUE) state<-c() for(i in score){ if(i >= 80) { state<-append(state, 'pass') } else if ((i >= 50) & (i < 80)) { state<-append(state, 'reExam') } else { state<-append(state, 'fail') }} state
[1] "fail" "pass" "reExam" "fail" "pass" "re-exam" "pass" [8] "reExam" "fail" "pass"
reExam<-function(x){ if(x>= 80) { return('pass') } else if ((x >= 50) & (x< 80)) { return('reExam') } else { return('fail')}} sapply(score, reExam)
[1] "fail" "pass" "re-exam" "fail" "pass" "re-exam" "pass" [8] "re-exam" "fail" "pass"
ifelse
ifelse() 함수는 if~else구문을 벡터화한 것입니다.- ifelse(cond, statement1, statement2)
- cond: true → statement1
- cond: false → statement2
state1<-c() for(i in 1:length(score)){ state1[i]<-ifelse(score[i] >= 70, 'pass', 'fail') } state1
[1] "fail" "pass" "fail" "fail" "pass" "pass" "pass" "pass" "fail" "pass"
switch
switch는 표현식의 값에 따라 명령문을 선택합니다.- witch(expr, case1=statement1, case2=statement2 ...)
- 표현(expr)과 같은 경우(case)에 할당된 statement를 반환
state
[1] "fail" "pass" "reExam" "fail" "pass" "reExam" "pass" "reExam" [9] "fail" "pass"
feel<-c()n<-1 for(i in state){ feel[n]<-switch(i, pass='good', reExam='more', fail='bad') n<-n+1}
[1] "bad" "good" "more" "bad" "good" "more" "good" "more" "bad" "good"
사용자 정의 함수(user-written function)
사용자의 필요에 따라 함수를 작성 할 수 있습니다. 이 함수의 기본 구조는 다음과 같습니다.함수이름<-function(인수1, 인수2, ...){ statement return(결과) }
statSummay<-function(x){ if (anyNA(x)) { x<-na.omit(x) }else { x<-x } n<-length(x) mu<-mean(x) medi<-median(x) sigma<-sd(x) skew<-sum((x-mu)^3/sigma^3)/n kurto<-sum((x-mu)^4/sigma^4)/n return(c(size=n, mean=mu, median=medi, std=sigma, skew=skew, kurtosis=kurto)) }
set.seed(4) x<-matrix(rnorm(100), nrow=20);x apply(x, 2, statSummay)
[,1] [,2] [,3] [,4] [,5] size 20.00000000 20.00000000 20.00000000 20.00000000 20.0000000 mean -0.09112079 -0.01366633 0.07024675 -0.15860301 -0.1892235 median 0.17607971 -0.28223164 0.18539902 -0.05325685 -0.1067961 std 1.10604986 0.86311186 0.78229639 1.07002236 1.0627715 skew -0.83991495 0.11297402 -0.59804775 -0.03626457 0.4993966 kurtosis 3.22600714 1.48409915 2.41566327 1.96281809 2.5255122
댓글
댓글 쓰기