[R] apply() Function과 예시


Apply function이란?

Apply functions are a family of functions in base R which allow you to repetitively perform an action on multiple chunks of data.
반복문의 기능을 하나, 반복문보다 빠르고 적은 코드를 요구한다는 것이 특징이다.

apply 이외에 vapply, tapply, mapply 등이 있지만 교수님이 퀴즈에는 apply 낸다고 하셨으므로 다음 기회에 정리할 예정이다 (^^;)

Anyways! apply는 행 또는 열 단위의 연산을 쉽게하도록 지원하는 함수이다.

과제 시 R studio를 사용하는데 콘솔에 아래와 같이 치면 간단한 설명이 나온다.
(어떤 함수든 ‘?함수명’ 을 치면 이와같이 설명을 볼 수 있다.)

?apply

1. 사용방법

apply의 기본 형식은 다음과 같다

apply(X, MARGIN, FUN)

  • X는 Input data로 array나 matrix처럼 모두 같은 변수형을 가진 값으로 이루어진 데이터 타입만 가능하다.
  • MARGIN은 행(Row)을 계산할 것인지 열(Column)을 계산할 것인지 명시해주는 곳인데
    1을 작성할 경우 행을 계산하고 2를 작성할 경우 열을 계산한다.
  • FUN 은 내가 사용하고싶은 함수를 작성하면 된다.

2. 예시

예시부분에는 참고사이트에 나와있는 예시와 내가 과제로 한 예시를 모두 넣도록하겠다.
1번부터 3번까지는 나와있는 예시를 가져다가 쓴 것이고, 마지막은 내가 과제에 사용한 예시이다.

my.matrx <- matrix(c(1:10, 11:20, 21:30), nrow = 10, ncol = 3)
my.matrx
##       [,1] [,2] [,3]
##  [1,]    1   11   21
##  [2,]    2   12   22
##  [3,]    3   13   23
##  [4,]    4   14   24
##  [5,]    5   15   25
##  [6,]    6   16   26
##  [7,]    7   17   27
##  [8,]    8   18   28
##  [9,]    9   19   29
## [10,]   10   20   30

예시 1. 행 더하기

apply(my.matrx, 1, sum)
##  [1] 33 36 39 42 45 48 51 54 57 60

행을 계산하고 싶은 것이므로 MARGIN 자리에는 1을, 단순 더하기이므로 FUN자리에는 기본 함수인 sum을 넣었다.

결과값을 보면 첫번째 행의 총합부터 10번째 행의 총합까지 나와있다.
33 = 1 + 11 + 21
36 = 2 + 12 + 22
.
.
.
60 = 10 + 20 + 30

예시 2. 열의 길이 구하기 + 내가 만든 함수 사용

apply(my.matrx, 2, function (x) length(x)-1)
## [1] 9 9 9

열을 계산하고싶은 것이므로 MARGIN은 2이다.

원래 각 열의 길이는 10이고 총 세개의 열이 있는데 이것을 살짝 변형하였다.
FUN 자리에 직접 만든 함수 function (x) length(x)-1) 를 넣어주었고
그리하여 10에서 1을 뺀 9 세개가 출력된다.

혹시 FUN 자리에 함수를 직접 사용하고싶지 않다면

fun <- function(x){
  length(x)-1
}
apply(my.matrx,2, fun)

이렇게 따로 명시해도 무방하다.

예시 3. 데이터 변형하기
이번 예시는 행 또는 열만 계산했던 앞선 예들 과는 다르게
행렬의 모든 요소들에게 반복된 계산을 하는 예시이다.

my.matrx2 <- apply(my.matrx,1:2, function(x) x+3)
my.matrx2
##       [,1] [,2] [,3]
##  [1,]    4   14   24
##  [2,]    5   15   25
##  [3,]    6   16   26
##  [4,]    7   17   27
##  [5,]    8   18   28
##  [6,]    9   19   29
##  [7,]   10   20   30
##  [8,]   11   21   31
##  [9,]   12   22   32
## [10,]   13   23   33

여기서 눈 여겨 봐야하는 부분은 바로 MARGIN이다.
1:2 으로 표시하므로써 모든 요소들(cell들)에 함수 계산을 대입하였다.
따라서 원래 값(my.matrx)와 비교해보면 각 요소 값이 3씩 증가함을 알 수 있다.

예시 4. 과제 사용한 예시
과제의 단편적인 부분이라 넣을까말까 했지만 나만의 기록이라 생각하고 작성해두겠다.
단편적인 부분만 잘라둔 것이라 이해가 안되실 수 도 있으니 스킵하셔도 됩니다.

교수님이 과제에서 요구하는 바는 Linear Regression 후 추출해낸 예상 fit 값이 유효한가
(== lower와 upper 사이에 존재하는가)를 계산 후 유효성 결과값을 0 또는 1로 추가 열을 만드시기를 바라셨다.
(유효한 값이면 1, 아니면 0)

내가 짠 코드는 아래와 같다.

match_f <- function(r, l, u){
  if(r <= u && r >= l){
    return(1)
  }
  return(0)
}

Matches <- apply(new, MARGIN = 1, function(x) match_f(x[2],x[3],x[4]))

우선 match_f라는 함수가 길기때문에 따로 명시해두었다.

사용되는 값이 하나인 앞선 예시들과 다르게 내 예시에서는 사용되는 인자값이 총 3개 (예상 fit 값, lower 값, upper 값)이므로 function(r,l,u) 이렇게 세개의 인자값이 들어간다고 적어야한다.
r은 도출해낸 예상 fit값이고, l은 lower, u는 upper이다.

함수(match_f)의 내용은 간단하다.
예상 fit값이 lower와 upper 사이의 값이면 제대로 된 fit값이니 1을, 아닐 시 0을 반환하는 것이다.

중요한 부분은 Matches 부분인데 여기서 Matches는 내가 데이터프레임에 추가로 넣을 열 이름이다.
내가 작성한 apply를 해석하자면

  • new 라는 데이터의 행(MARGIN = 1)을 계산하고자하는 것이다.
  • 이때 계산할 함수로는 match_f로 new의 두번째, 세번째, 네번째 행을 인자값으로 넣어준다.
    (new의 두번째, 세번째, 네번째 행이 차례대로 예상 fit값, lower값, upper값 이다.)

마무리 및 사담

apply를 사용한 과제가 Linear Regression 과제였어서 관련 내용을 먼저 작성하고싶었으나, 인생은 그렇게 여유롭게 흘러가지않는다…ㅋㅋㅋㅋ
사실 이 글도 내일 수업 중 apply 관련 퀴즈가 있다고해서 급한대로 정리한는 것이다.
이렇게라도 첫번째 글을 쓰게 되어 다행이고 시간 나는대로 차근차근 정리해서 올리도록하겠습니다🥺
(+이렇게 정리도 해뒀는데 이번 퀴즈는 기필코 다 맞으리.)

참고문헌





© 2020.09. by 다로

Powered by theorydb