R분석을 하다 보면 데이터 전처리 라든지 그래프 그리기, 혹은 모형 개발/ update 등을 하는데 있어 반복 작업을 하는 경우가 있습니다. 

 

이때 대상 데이터셋이라든지 변수, 혹은 조건 등을 조금씩 바꿔가면서 반복 작업을 (반)자동화 하고 싶을 때 유용하게 사용할 수 있는 것이 사용자 정의 함수 (User Defined Function) 입니다. 

 

만약 사용자 정의 함수를 사용하지 않는다면 특정 부분만 바뀌고 나머지는 동일한 프로그램이 매우 길고 복잡하고 산만하게 늘어세울 수 밖에 없게 됩니다.  반면 사용자 정의 함수를 사용하면 사용자 정의 함수 정의 후에 바뀌는 부분만 깔끔하게 사용자 정의 함수의 입력란에 바꿔서 한줄 입력하고 실행하면 끝입니다.  반복작업이 있다 싶으면 손과 발의 노가다를 줄이고 작업/분석 시간을 줄이는 방법, 프로그래밍을 간결하고 깔끔하게 짜는 방법으로 사용자 정의 함수를 사용할 여지가 있는지 살펴볼 필요가 있겠습니다.

 

 

 

 

 

사용자 정의 함수는

 

 

function_name <- function( arg1, arg2, ... ) {

                                                           expression

                                                           return( object)

                                                         }

 

 

의 형식을 따릅니다.

 

몇 가지 예을 들어서 설명해보겠습니다.

 

 

1) 평균(mean), 표준편차(standard deviation), min, max 계산 사용자 정의 함수
    (User defined function of statistics for continuous variable)

 

 

> # 평균, 표준편차, min, max 계산 > > stat_function <- function(x) { + x_mean = mean(x) + x_sd = sd(x) + x_min = min(x) + x_max = max(x) + x_summary = list(x_mean=x_mean, x_sd=x_sd, x_min=x_min, x_max=x_max) + return(x_summary) + } > > stat_function(x = Cars93$MPG.highway) $x_mean [1] 29.08602 $x_sd [1] 5.331726 $x_min [1] 20 $x_max [1] 50 > # summary() 함수와 비교 > summary(Cars93$MPG.highway) Min. 1st Qu. Median Mean 3rd Qu. Max. 20.00 26.00 28.00 29.09 31.00 50.00

 

 

 

 

2) 산점도 그래프 그리기 사용자 정의 함수 (User defined function of scatter plot)

 

> # 산점도 그래프 그리기 함수 (scatter plot)
> plot_function <- function(dataset, x, y, title) {
+   attach(dataset)
+   plot(y ~ x, dataset, type="p", 
+        main = title)
+   detach(dataset)

 

 

> plot_function(dataset=Cars93, x=MPG.highway, y=Weight, title="Scatter Plot of MPG.highway & Weight")

 

 

> plot_function(dataset=Cars93, x=Price, y=Horsepower, title="Scatter Plot of Price & Horsepower")
 

 

 

 

위의 기초통계량은 summary() 함수를 사용하면 되고 산포도도 plot() 함수를 쓰는 것과 별 차이가 없어보여서 사용자 정의 함수를 쓰는 것이 뭐가 매력적인지 잘 이해가 안갈 수도 있을 것 같습니다.  하지만 만약 기초 통계량을 뽑아서 txt 파일로 외부로 내보내기를 하고, x 변수를 바꿔가면서 loop를 돌려서 반복적으로 기초 통계량을 뽑고 이것을 계속 txt 파일로 외부로 내보내기를 하되, 앞서 내보냈던 파일에 계속 append 를 해가면서 결과값을 저장한다고 할때는 위의 사용자 정의 함수를 사용하는 것이 정답입니다. 

 

그래프도 변수명의 일부분을 바꿔가면서 그래프를 그리고 싶을 때는 paste() 함수를 적절히 사용하면 사용자 정의 함수를 더욱 강력하게 사용할 수 있게 됩니다.  응용하기 나름이고, 사용 가능한 경우가 무궁무진한데요, 이번 포스팅에서는 사용자 정의 함수의 기본 뼈대에 대해서만 간략히 살펴 보았습니다.

 

참고로, 사용자 정의 함수를 정의할 때 아래처럼 function(x, y, ...) 의 파란색 생략부호 점을 입력하면 나중에 사용자 정의 함수에서 정의하지 않았던 부가적인 옵션들을 추가로 덧붙여서 사용할 수 있어서 유연성이 높아지는 효과가 있습니다.

function_name <- function(x, y, ...) {

expresstion

return(object)

}

 

많은 도움 되었기를 바랍니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

 

Posted by R Friend R_Friend

댓글을 달아 주세요

  1. kjh 2016.09.16 17:15  댓글주소  수정/삭제  댓글쓰기

    연습차 팩터로 변환하는 함수를 만들어보려고 하는데요

    factorize <- function(a, b){
    i <- which(names(b)==a)
    b[i] <- as.factor(b[i])
    }
    일단 오류가 발생하는 3번째줄을 [[i]]로 두군데 다 바꿔주면 된다는 사실을
    다른 카페에서 알게되긴 했는데요,(as.factor가 데이터프레임에만 되는건가요?)
    일단 함수가 오류없이 만들어지긴 해도, 의도했던 팩터화는 되지가 않더라구요.
    factorize("cyl", mtcars)를 해봐도 팩터화가 안되는데, 그 이유가 궁금합니다..


    그리고 함수를 사용할 때
    factorize("cyl", mtcars) 처럼 써야 하는데
    a위치에 들어가는 것에 따옴표를 안붙여도 되게 하려면 어떻게 해야 할까요

    • R Friend R_Friend 2017.07.06 00:19 신고  댓글주소  수정/삭제

      kjh님, 댓글을 이제서야 봤네요. ^^;

      아래처럼 해보시기 바랍니다.

      factorize <- function(var, df){
      i <- which(names(df) %in% var)
      df[,i] <- lapply(df[,i], factor)
      return(df)
      }

      mtcars <- factorize(c("cyl", "gear"), mtcars)
      str(mtcars)

      > str(mtcars)
      'data.frame': 32 obs. of 11 variables:
      $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
      $ cyl : Factor w/ 3 levels "4","6","8": 2 2 1 2 3 2 3 1 1 2 ...
      $ disp: num 160 160 108 258 360 ...
      $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
      $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
      $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
      $ qsec: num 16.5 17 18.6 19.4 17 ...
      $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
      $ am : num 1 1 1 0 0 0 0 0 0 0 ...
      $ gear: Factor w/ 3 levels "3","4","5": 2 2 2 1 1 1 1 2 2 2 ...
      $ carb: num 4 4 1 1 2 1 4 2 2 4 ...


      =====================
      물론 변환할 변수가 몇 개 안되면 그냥 아래처럼 하는게 편합니다.

      mtcars <- transform(mtcars, cyl = as.factor(cyl))

  2. 러투스 2017.07.05 20:58 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 포스팅 감사합니다.