본문 바로가기
데이터 [Data]/R

R 제어문: 조건문, 반복문

by 냉철하마 2021. 4. 30.

참고도서: R 통계 프로그래밍의 이해 - 차영준, 박진표 (자유아카데미) 4장

www.yes24.com/Product/Goods/68712840

 

R 통계 프로그래밍의 이해

'최근에 빅데이터와 관련된 용어들이 많이 사용되고 있다. 인공지능, 머신러닝, 데이터 과학, 데이터 과학자, 4차 산업혁명 등과 같은 단어들을 많이 접하게 된다. 이처럼 많은 사람들이 빅데이

www.yes24.com

 

> #### 4.1 조건문 ####

>

> # 4.1.1 단순 if() #

> x <- c(1,3,5,7,9)

> y <- c(3,4,5,6,7)

> if(mean(x) == mean(y)) print ("mean(x) is equal to mean(y)")

[1] "mean(x) is equal to mean(y)"

> ## x의 평균과 y의 평균이 같을 경우 "mean(x) ~ mean(y)" 문구 출력

> if(var(x) > var(y)) {print("var(x) is greater than var(y)")

+ print(var(x))

+ print(var(y))}

[1] "var(x) is greater than var(y)"

[1] 10

[1] 2.5

> ## x의 분산이 y의 분산보다 클 경우 "var(x) ~ var(y)" 문구를 출력하고

> ## x의 분산값과 y의 분산값도 같이 출력

>

> # 4.1.2 다중 if ~ else #

> x <- c(1,3,5,7,9)

> y <- c(3,4,5,6,7)

> if(is.vector(x)) print("x is vector") else print("x is not vector")

[1] "x is vector"

> ## x가 벡터가 맞으면 "x is vector", 아니면 "x is not vector" 출력

> if(var(x)>var(y)){

+ print(mean(x))

+ print(var(x))

+ } else {

+ print(mean(y))

+ print(var(y))

+ }

[1] 5

[1] 10

> ## x의 분산이 y의 분산보다 클 경우 x의 평균과 분산 출력

> ## x의 분산이 y의 분산보다 크지 않을 경우 y의 평균과 분산 출력

>

> # 4.1.3 ifelse() #

> #ifelse()

> jumsu <- c(99, 20, 44, 60, 80, 70)

> grade <- ifelse(jumsu >= 60, "Pass", "Fail")

> ## jumsu(점수)60점 이상이면 "Pass", 미만이면 "Fail"

> data.frame(jumsu, grade) ## jumsu(점수)grade(등급)을 데이터 프레임으로 합침

   jumsu grade

1 99 Pass

2 20 Fail

3 44 Fail

4 60 Pass

5 80 Pass

6 70 Pass

>

> #결측값을 0으로 변경

> xVec <- c(11,22,33,44,55,66,NA)

> xVec

[1] 11 22 33 44 55 66 NA

> ifelse(is.na(xVec), 0, xVec) ## xVec에 결측값이 있을 경우 결측값은 0으로 변환, 아니면 그대로 출력

[1] 11 22 33 44 55 66 0

>

> # 4.1.4 switch() #

> score <- c(1,2,3,4,5)

> switch(2, mean(score), sum(score), var(score))

[1] 15

> ## switch: 인수의 값에 따라 해당 조건에 맞는 수식 또는 연산 수행

> ## switch문에서는 인수의 값이 2이므로 두 번째 조건인 sum(score) 출력

> type1 <- "x" ## 쌍따옴표("") 표시 필수

> type2 <- "y"

> type3 <- "z"

> switch(type1, x=mean(score), y=sum(score), z=var(score))

## 인수 type1x이기 때문에 이에 해당하는 mean(score) 출력

[1] 3

> switch(type2, x=mean(score), y=sum(score), z=var(score))

## 인수 type2y이기 때문에 이에 해당하는 sum(score) 출력

[1] 15

> switch(type3, x=mean(score), y=sum(score), z=var(score))

## 인수 type3z이기 때문에 이에 해당하는 var(score) 출력

[1] 2.5

>

> #### 4.2 반복문 ####

>

> # 4.2.1 for() #

> #for() 문을 이용한 짝수와 홀수의 합 계산

> evenSum <- 0 ## evenSumoddSum0으로 초기화

> oddSum <- 0

> for (x in 1:100)

+ if(x %% 2 == 0) { ## x의 나머지가 0일 경우

+ evenSum <- evenSum + x ## evenSum에 값을 더하고

+ } else {                          ## 나머지가 0이 아닐 경우

+ oddSum <- oddSum + x   ## oddSumm에 값을 더함

+ }

> print(evenSum) ## 짝수의 합 출력

[1] 2550

> print(oddSum) ## 홀수의 합 출력

[1] 2500

>

> #for() 문을 이용한 '결측값을 제외'한 벡터 생성

> data <- c(1,NA,NA,2,3,4,5,NA,6,7,8,NA,9,10,NA)

> completeData <- c() ## completeData 변수를 초기화

> completeData ## NULL

NULL

>

> for(x in data)

+ if(!is.na(x)) {                ## x가 결측값이 아닌 경우 (!: NOT의 의미)

+ completeData <- c(completeData, x)

+ } else {                      ## 변수에 값을 넣고 아닐 경우 실행 없이 넘어감

+ next

+ }

> print(completeData)

[1] 1 2 3 4 5 6 7 8 9 10

> print(length(completeData)) ## 결측값 제외된 completeData 변수의 길이 출력

[1] 10

>

> #for() 문을 이용한 '결측값을 0으로 수정'한 벡터 생성

> data <- c(1,NA,NA,2,3,4,5,NA,6,7,8,NA,9,10,NA)

> for(x in 1:length(data)) { ## 1부터 data 변수의 길이까지 반복

+ if(is.na(data[x])) data[x] <- 0

+ } ## data[x](벡터의 자리위치)의 값이 결측값일때 0으로 변환

> print(data) ## 결측값이 0으로 변환된 data 변수 출력

[1] 1 0 0 2 3 4 5 0 6 7 8 0 9 10 0

> print(length(data)) ## 결측값 변환된 data 변수 길이 출력

[1] 15

> print(mean(data)) ## 평균 출력: 결측값이 0이 되었으므로 이 또한 평균 계산식에 포함

[1] 3.666667

 

댓글