천선생의 삶
[R] 사용자 정의 함수 활용하기 - function 본문
안녕하세요. 천선생입니다.
지난 포스트까지 반복문과 조건문에 대해 알아봤는데요.
포스트를 보시면서, '너무 대충하고 넘어가는 것 아닌가?' 라고 생각하실 수도 있는데요!!
개인적으로 조건문과 반복문의 진가는 사용자 정의 함수에서 발휘된다고 생각합니다.
따라서 이 포스트에서 사용자 정의 함수의 활용범위를 확인하시고 사용법에 맞게 조정하는 법을 연습하시면,
조건문과 반복문은 따로 시간을 들여 노력하지 않아도 쉽게 사용하실겁니다.
그럼 이제부터, 사용자 정의 함수에 대해서 알아보도록 하겠습니다!
- FUNCTION?
function이란, 영어 뜻 그대로 사용자 정의 함수를 정의하는 함수입니다.
기본 형태는 다음과 같습니다.
# function의 기본형태
function (입력변수명1 = default값, 입력변수명2 = default값2, ....) {
입력변수를 활용하여 수행할 코드
..
return(결과값)
}
입력변수명에 default를 지정하면, 함수 구동시 입력변수를 넣지 않아도 default가 입력된 것처럼 실행하게 됩니다.
- RETURN?
처음에 function을 사용하면서 가장 많이 부딪히게 되는게 바로 return이라는 인자인데요.
바로 출력값을 지정하는데 왜 print나 cat을 사용하지 않지? 라는 의구심 때문일겁니다.
간단하게 말씀드리면, print와 cat은 반환값을 주지않으며, 연산결과를 출력하는데 그치는 인자입니다.
즉, 원하는 수행한 코드의 결과값을 새로운 변수로 저장하려면 return이라는 인자를 반드시 써야한다는 것입니다.
만약 return 값을 따로 지정하지 않으면, 마지막으로 저장된 변수값을 자동으로 반환하게 됩니다.
간단한 function을 작성하는 코드와 함께, return과 cat의 차이점에 대해 보여드리겠습니다.
# function을 활용한 간단한 예제 (2개의 제곱합 구하기)
#return을 입력
sum_func_return <- function(x, y) { # default값을 지정하지 않아도 된다.
res <- x^2 + y^2
return(res)
}
#cat을 입력
sum_func_cat <- function(x, y) { # default값을 지정하지 않아도 된다.
res <- x^2 + y^2
cat(res)
}
sum_func_return(2, 3)
# [1] 13
sum_func_cat(2, 3)
# 13
#두 함수 모두 값을 출력한다. 그렇다면 변수에 저장해보면 어떨까?
res_return <- sum_func_return(2, 3)
res_return
# [1] 13
res_cat <- sum_func_cat(2, 3)
res_cat
#NULL
#cat을 사용한 함수로 입력한 변수는 NULL값을 반환한다. 함수에서 결과값을 반환(return) 하지 않았기 때문!
간단한 예제를 통해 cat과 return의 차이에 대해서 확인하셨을 것이라고 생각합니다. 꼭 기억해주세요!
- 활용
사실 function의 활용은 한 포스트에 담기에는 무궁무진할 정도로 많습니다.
따라서 이후 고급분석을 할 때마다, 새로운 활용법을 익힌다고 생각하시면 됩니다.
오늘은 반복문과 조건문을 활용하여 사용자 정의 함수를 활용하는 예제를 보여드리며 마무리하겠습니다.
- 데이터프레임에서 Numeric column만을 선택해서 평균값을 구하는 함수를 만들어보자.
# 사용자 정의 함수를 활용한 numeric column별 평균 구하기
numeric_col_means <- function(data){
cols <- colnames(data) # 데이터프레임의 열들의 이름을 가져온다.
res <- c() # 결과값을 저장할 벡터를 만든다.
for (col in cols){
tmp_col <- data[[col]]
if (class(tmp_col) == 'numeric') { # 타입이 numeric인 컬럼만 가져온다.
col_avg <- mean(tmp_col) # 각각의 평균값을 계산한다.
res <- c(res, col_avg) # 결과값에 저장한다.
}
}
return(res) # 저장한 결과값을 반환한다.
}
str(iris)
# 'data.frame': 150 obs. of 5 variables:
# $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
# $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
# $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
# $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
# $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
# iris 데이터는 Species 열을 제외하고 모두 numeric 타입입니다.
numeric_col_means(iris)
# [1] 5.843333 3.057333 3.758000 1.199333
복잡한 계산처럼 보이지만, function 내부에 있는 수행연산은 우리가 모두 익힌 것입니다!
내부의 식들을 뜯어보며 꼼꼼히 연습하다보면, 직접 손쉽게 함수를 짜는 날이 머지않았다는 것을 느끼실겁니다.
'Data Analysis > R Basic' 카테고리의 다른 글
[R] 시각화 시작하기 - ggplot2 (0) | 2019.07.23 |
---|---|
[R] apply 함수 활용하기 - apply, sapply (0) | 2019.07.14 |
[R] 반복문 활용하기 - for, while (0) | 2019.07.11 |
[R] 조건문 활용하기 - if, else, if else (0) | 2019.07.10 |
[R] 데이터 유형에 따른 정리(5) - dataframe (0) | 2019.07.09 |