티스토리 뷰

반응형

지난번엔 R의 lapply, sapply, vapply를 살펴봤다. 

이어서 다른 종류의 apply를 알아보도록 하자. 


apply

lapply와 sapply는 모두 리스트를 입력으로 받아서 각 리스트에 함수를 적용한다고 했다. 

만약 리스트가 아닌 행렬(matrix)을 입력으로 넣으면 어떻게 될까? 


rnorm()으로 평균 0, 표준편차가 1인 정규분포를 갖는 20x10 행렬을 만들었다. 

그리고 lapply로 평균을 구해보니, 결과가 무려 200개의 리스트가 나온다. 

즉, 행렬의 각각의 요소를 리스트의 개별 요소로 보고 처리한 것이다. 


보통 행렬에서는 각각의 행이나 열에 대해 함수를 적용하는 것이 필요하다. 

이런 경우에 apply를 사용하면 된다. 


apply 함수의 두번째 인자로 1을 넣으면 행(row)에 대한 함수를 적용하고, 

2를 넣으면 열(column)에 대해 함수를 적용하게 된다. 

위 예제에서 apply(x, 2, mean)은 열에 대한 평균값을 구했고, apply(x, 1, sum)은 행에 대한 합계를 구한 것이다. 


즉, 행렬에 대해 반복적으로 함수를 적용해야 할 경우에는 apply를 사용하면 된다. 

보통 이렇게 행이나 열에 대해 평균이나 합계를 구하는 경우가 많기 때문에, R에서는 이것을 별도의 함수로 제공한다. 


바로 rowMeans, colMeans, rowSums, colSums 이다. 

위 예제를 보면 결과가 동일한 것을 알 수 있다. 

참고로 속도 측면에서도 apply보다 더 빠르다고 한다. 


tapply

처음에는 tapply가 테이블 즉, 행렬에 적용되는 것인 줄 알았다. 

tapply는 리스트나 행렬, 데이터셋의 특정 요소(factor)를 기준으로 함수를 수행하는 역할을 한다. 

먼저 다음과 같이 변수들을 만들어 보자. 


rnorm은 정규분포를 만는 것으로 rnorm(10)은 평균 0, 표준편차가 1이고, rnorm(10, 1)은 평균  1, 표준편차가 1인 수를 10개씩 만드는 것이다. 

runif(10)는 균등분포를 만드는 함수로서 최소값 0과 최대값 1 사이의 10개의 수를 만든다. 

그리고 gl(3, 10)은 Factor Level을 생성하는데, 여기에서는 1, 2, 3 세 개의 Factor에 각각 10개씩 만들었다. 


이제 tapply를 적용해 보자. 


세 개의 Factor Level에 대해 각각의 평균을 구하도록 tapply를 사용했다. 

simplify는 기본값으로 true로 되어 있으며, 이 경우 sapply와 동일하게 벡터로 결과값을 리턴한다. 

두 번째 예제처럼 simplify를 false로 지정하면 lapply와 동일하게 동작한다. 


평균값을 구하는 mean이외에도 범위를 구하는 range 등을 활용할 수 있다. 

이럴 경우에는 값이 벡터 형태로 리턴할 수 없으므로 simplify는 무시하게 된다. 


실제로 tapply는 데이터셋에 대해 주로 사용한다. 

먼저 데이터셋 처리 함수에서 살펴본 mtcars를 가지고 살펴보자.


실린더 수(cyl)에 따른 각 행의 개수는 table(mtcars$cyl)로 바로 가져올 수 있었다. 

하지만, 만약에 실린더 수에 따른 mpg 값의 평균을 구해야 한다면 어떻게 할까? 

아마도 실린더 수에 따라 데이터 셋을 나누고, 각각 분할된 데이터에 대해 평균을 구하려고 할 것이다. 

이런 경우에 tapply를 사용하면 된다. 


tapply를 알면 정말 쉽게 데이터셋을 다룰 수 있다. 

반드시 그 활용을 이해해 두기 바란다. 

참고로 위 예제는 다음과 같이 표현할 수도 있다. 


다른 데이터셋으로도 한번 살펴보자. 

iris라는 붓꽃의 데이터셋도 mtcars처럼 R에 포함되어 있다. 


iris 데이터셋은 품종(setosa, versicolor, virginica)에 대해 각각 꽃받침과 꽃잎의 길이와 너비를 저장한 데이터이다. 

만약 품종이 setosa인 꽃받침 길이의 평균을 구할 경우 어떻게 해야 할까?

아니면 품종이 setosa인 꽃받침과 꽃잎의 길이와 너비의 평균을 구할 경우에는 어떻게 할까?


첫번째의 경우는 데이터셋의 일부를 가져와서 평균을 구하면 된다. 

두번째 경우에는 앞서 배운 apply나 colMeans를 사용해서 처리할 수 있다. 


마지막으로 품종별 꽃받침 길이의 평균을 구해야 한다면, Factor Level을 사용하는 tapply로 간단하게 해결할 수 있다. 

미니의 R 주요 강좌...

데이터 통계 분석을 위한 R 설치와 활용

R 실행을 위한 기본적인 내용들~

R 데이터 구조에 대한 정리

R 패키지 설치하기

R 데이터셋 처리 함수들에 대한 간단한 정리~

R 데이터셋 정렬하기~

R 데이터셋의 일부 데이터 가져오기

R의 lapply, sapply, vapply를 이해하자~

R의 apply, tapply의 활용법을 알아보자~

R의 split 활용

R의 함수 작성 및 활용~

R 시뮬레이션 - 랜덤 변수 샘플링

R 함수에서 캐시 활용하기~

R 디버깅 툴 활용하기~


반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/03   »
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 26 27 28 29 30
31
글 보관함