獨斷論

통계 R 사용설명서 15 - 헷갈리는 apply, lapply, sapply, tapply 요약정리 본문

과학과 기술/R 통계

통계 R 사용설명서 15 - 헷갈리는 apply, lapply, sapply, tapply 요약정리

부르칸 2016. 5. 19. 07:10

행렬의 열방향이나 행방향으로 어떤 함수를 적용하여 그 결과를 보고싶은 경우가 있다.

쉬운 예로 행렬에서 각 행의 평균을 구한다거나 각 열의 평균을 구하고 싶은 때에 apply()라는 함수를 이용한다.



apply( )로 각 행과 열의 평균 구해보기


우선 예제에서 사용하고자 하는 행렬을 만들어보자.


1

2

3

4

5

6

7

 > x <- matrix(1:20, nrow=4)
 > x
      [,1] [,2] [,3] [,4] [,5]
 [1,]    1    5    9   13   17
 [2,]    2    6   10   14   18
 [3,]    3    7   11   15   19
 [4,]    4    8   12   16   20


이 행렬에서 행방향으로 평균을 구하고자 한다면 아래와 같이 한다.


1

2

3

 > mean_row <- apply(x, 1, mean)
 > mean_row
 [1]  9 10 11 12


9는 (1+5+9+13+17)/5의 값이다. 나머지도 만찬가지.


열방향으로 평균을 구할땐 1을 2로 바꾸면 된다.


1

2

3

 > mean_col <- apply(x, 2, mean)
 > mean_col
 [1]  2.5  6.5 10.5 14.5 18.5


2.5는 (1+2+3+4)/4이다.
이는 변수 x가 행렬이 아니라 데이터프레임일때도 똑같이 적용된다.



lapply( )로 평균 구하기


lapplyapply를 list에 적용하게 하는 함수이다.

위 행렬과 똑같이 1~4는 x.list라는 리스트변수의 a에 넣고, 5~8은 b에 넣고, 9~12는 c에 넣고 13~16은 d에 넣고 17~20은 e에 넣어보자.


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

 > x.list <- list(a = 1:4, b = 5:8, c = 9:12, d = 13:16, e = 17:20)
 > x.list
 $a
 [1] 1 2 3 4

 $b
 [1] 5 6 7 8
 
 $c
 [1]  9 10 11 12

 $d
 [1] 13 14 15 16

 $e
 [1] 17 18 19 20


이제 lapply( )를 이용하여 x.list의 각 변수마다 평균을 구하여보면


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

 > results.list <- lapply(x.list, mean)
 > results.list
 $a
 [1] 2.5

 $b
 [1] 6.5

 $c
 [1] 10.5

 $d
 [1] 14.5
 
 $e
 [1] 18.5
 
 > class(results.list)
 [1] "list"


위와 같다.
lapply()를 적용하여 리스트 변수의 평균을 구하였을때 그 결과도 리스트임을 보여주고 있다.



sapply( )로 평균 구하기


만약 리스트변수의 평균을 구하여 그 결과를 그냥 벡터변수에 넣고 싶다면 sapply()를 이용하면 된다.


1

2

3

4

5

6

 > results <- sapply(x.list, mean)
 > results
    a    b    c    d    e
  2.5  6.5 10.5 14.5 18.5
 > class(results)
 [1] "numeric"


위 스크립트에서 변수 results는 리스트가 아니고 벡터임을 보여준다.



tapply( )로 평균 구하기


tapply는 변수값이 범주형변수로 분류되어있을때 범주형변수의 각 그룹마다 평균을 구하고자 할때 사용된다.

만약 1~20까지의 숫자가 1~4까지는 a라는 범주형변수 값에 해당되고, 5~8은 b, 9~12는 c, 13~16은 d, 17~20은 e에 해당된다고 가정하자.


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

 > x <- 1:20
 > grouping <- rep(c("a", "b", "c", "d", "e"), each=4)
 > x.df <- data.frame(x, grouping)
 > x.df
     x grouping
 1   1        a
 2   2        a
 3   3        a
 4   4        a
 5   5        b
 6   6        b
 7   7        b
 8   8        b
 9   9        c
 10 10        c
 11 11        c
 12 12        c
 13 13        d
 14 14        d
 15 15        d
 16 16        d
 17 17        e
 18 18        e
 19 19        e
 20 20        e


이제 a 그룹은 a 그룹데로 평균을 구하고, b그룹은 b그룹데로 평균을 구하고자 한다면 tapply를 이용하면 된다.


1

2

3

4

5

6

 > results <- tapply(x.df$x, x.df$grouping, mean)
 > results
    a    b    c    d    e
  2.5  6.5 10.5 14.5 18.5
 > class(results)
 [1] "array"








Comments