Programming Language/etc

[R.입문] R 프로그래밍

김크리 2021. 10. 10. 18:10

목차

조건문

프로그램을 실행하는 도중에 만족하는 조건에 따라 코드를 분기할 때 사용하는 구문이다.

조건을 만족하는지에 따라 실행하는 코드를 다르게 설정할 수 있다. 반복문안에 조건문을 사용하여 조건문을 제어할 수 있다.

if(조건){
	#실행 코드
} else if (조건) {
	#실행 코드
} else{
	#실행 코드
}

ifelse() 함수

데이터를 전처리하여 분기할 때 사용한다. test, yse, no 라는 매개변수가 있다. test는 true/false 반환하는 조건을 지정한다.

ifelse(test=TRUE/FALSE로 반환되는 코드,
		yes = test가 참일 때 반환하는 값,
        no = test가 거짓일 때 반환하는 값)
score<-seq(from=40, to=100,by=100)
ifelse(test = score >= 70, yes='합격', no='불합격')

반복문

어떠한 코드에서 일부의 값을 바꿔가면서 반복하여 실행할때 사용한다.

score<-seq(from=40, to=100, by=100) 과 같이 이전에 우리가 사용한 리스트 생성하는 코드 또한 내부에서는 반복문이 실행되며 값을 만들어내는 것이다.

반복문에는 for 문, while 문, repeat이 있다.

for (변수 in 벡터) {
	#실행 코드
}
while(조건) {
 #실행 코드
}
repeat {
	#실행코드
    if(조건){
    	break
    }
}

R언어의 print는 두개 이상의 문자를 결합하는 기능이 없다는 것을 참고하자.

두 개 이상의 문자를 결합하기 위해서는 cat을 사용한다.

#반복문
menu <- c('짜장면','탕수육','깐풍기','짬뽕')
for( item in menu){
  print(x=item)
}

menu <- c('짜장면','탕수육','깐풍기','짬뽕')
for(item in menu){
  print(item, " want?\n")
  # print는 두개 이상의 문자열을 결합하는 기능이 없어 에러가 발생한다.
}

for(item in menu){
  cat(item," want?\n")
}

paste() : 문자열 연결

for(item in menu){
  text <- paste(item, "want?\n")
  print(x=text)
}

while문

i<-5
while(i>0){
  print(x=i)
  i<-i-1
}

next : 코드 건너뛰기

next 문을 만나면 이후 코드를 실행하지 않고 반복문의 처음으로 들어간다.

java에서는 continue 와 같이 동작한다.

for(item in menu){
  if(item %in% c('짜장면','짬뽕')){
    next
    #next로 인해 실행되지 않는다.
    cat(item,' food\n',sep='?')
  } else{
    cat(item, 'next? \n',sep='?')
  }
}

break : 반복문 탈출하기

i<-0
while(TRUE){
  print(x=i)
  i<-i+1
  if(i>5){
    break
  }
}

사용자 정의 함수

사용자 정의 함수는 사용자가 직접 정의한 함수를 의미한다. 이를 통해 코드를 이해하기 쉽고 재사용성을 높일 수 있다.

또한, 코드의 유지보수를 쉽게 해준다.

function(a, b){
	#실행코드
	return (c)
}
Pythagoras <- function(a,b){
  c<- sqrt(x=a^2 + b^2)
  return (c)
}
Pythagoras(a=3, b=4)

#사용자 정의 함수 생성
getGrade <- function(score){
  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'
  }
  return (grade)
}
getGrade(score=100)

파일로 저장하여 사용자 함수 재사용

R 파일로 사용자 정의 함수를 저장하여 재사용 할 수 있다.

source(file='경로명/파일명.R', encoding='UTF-8', ...)
##정의한 함수 삭제
rm(getGrade)
source(file='경로/myFuncs.R', encoding='UTF-8')

getGrade(score=100)

인수의 기본값 설정

사용자 정의 함수의 매개변수에 전달되는 인수의 기본값을 설정할 수 있다.

#기본값 설정
guessHeight <- function(name='홍길동',height=173){
  answer <- paste(name,' 님의 키는 ',height,'cm 입니다.')
  return(answer)
}
guessHeight()
guessHeight(name='정우성',height=186)

함수 반복

이전에는 특정 변수를 넣어 반복하였다. 하지만 이번에는 같은 함수를 반복 실행하는 apply() 함수를 사용해보자

apply()

벡터를 넣어 반복 실행하는 함수이다. 행렬의 행 또는 열 방향으로 같은 함수를 반복 실행하는 함수이다. 이 함수를 사용하기 위해서는 행렬에 대해 이해하고 있어야한다.

MARGIN을 지정하여 해당 함수를 1(행방향), 2(열방향)으로 원소를 선택할 수 있다.

R언어는 대소문자를 구분한다는 것을 잊지말자.

apply(x=객체명, MARGIN=1 또는 2, FUN=함수)
#str() 함수로 행렬 데이터 출력
#iris는 생물 학자가 다중 측점 사용을 소개한 다변량 데이터 셋이다.
# 붓꽃 품종에 대해 길이와 너비를 측정한 값이다.
str(object =iris)

# head(), tail() 함수를 통해 객체의 일부만 출력할 수 있다,.
# 두 함수의 출력 기본 line 수는 6이다.

#as.matrix(x=객체명) 을 통해 R 객체를 행렬로 변환 할 수 있다.
irisMat1 <- as.matrix(x=iris)
head(x=irisMat1)
tail(x=irisMat1, n=3)

irisMat2 <- as.matrix(x=iris[,1:4])
head(x=irisMat2)

#apply()
apply(X = iris[,1:4], MARGIN = 1, FUN = mean)

for 문과의 비교

apply() 함수로는 한줄로 진행할 수 있는 코드가 for 문으로는 5줄이 필요한다.

apply로 코드의 간결성, for 문에 사용한 인덱스 변수(i) 생성과 같은 불필요한 변수 선언 등에서 강점을 가지고있다. 

avg <- c()
for(i in 1:150){
  row <- iris[i,1:4]
  row <- as.numeric(x=row)
  avg[i] <- mean(x=row)
}

lapply(), sapply()

벡터, 리스트, 데이터 프레임의 원소를 지정된 함수에 넣어 반복 실행하는 함수이다. 

apply함수와 다르게 MARGIN 매개변수가 없다. lapply()는 항상 리스트를 반환하고, sapply()는 벡터/행렬을 반환한다.

sapply는 apply()함수의 MARIN에 2를 지정하여 실행한 것과 같다.

#lapply
lapply(X=univ, FUN=mean)
#sapply
sapply(X = univ, FUN = mean)

sapply(X = univ, FUN = mean, simplify = FALSE)

 

참고

나성호의 R 데이터 분석 입문 도서
https://github.com/HelloDataScience/DAwR