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

|



R에는 lapply, sapply, vapply, apply, tapply등 다양한 apply 함수들이 존재한다.

데이터 분석에서 "Split-Apply-Combine" 이라는 전략을 구현한 것이 바로 apply이다. 

즉, 데이터셋을 나누어서 각 조각들을 만들고, 각각의 조각에 특정 함수를 적용하고, 결과를 합쳐서 제공한다는 것이다. 


lapply

먼저 lapply부터 살펴보자. 

lapply의 l은 리스트를 나타낸다. 즉, 입력으로 리스트를 받아서 결과로 리스트를 제공한다는 것이다. 


lapply를 테스트하기 위해 먼저 리스트를 만들어 보자. 


rnorm은 정규 분포를 따르는 수를 만드는 것으로, rnorm(10)은 기본값으로 평균 0, 표준편차 1인 정규분포를 갖는 10개의 수를 만든다. 

리스트의 각 항목, 여기에서는 a와 b에 대해 각각의 평균을 구한다고 생각해 보자. 

for 문과 같은 반복문을 통해서 각각의 평균을 구할 수도 있겠지만, 

앞서 이야기한 "Split-Apply-Combine"을 활용한 lapply로 한번에 평균을 구할 수 있다. 


lapply(x, mean)은 x 리스트의 각 요소에 대해 mean() 함수를 적용하라는 것이다. 

결과를 확인해보면, a와 b 각각의 평균을 보여주는 것을 알 수 있다. 

class() 함수를 결과값을 확인하면, 역시 리스트로 전달되는 것을 알 수 있다. 


경우에 따라서는 결과값을 리스트가 아닌 벡터 형태로 사용할 필요가 있다. 

그래서 as.dobule(x_list)로 결과를 벡터로 변경하면 다음과 같다. 


이와 같이 리스트로 결과를 리턴하지 않고 벡터로 바로 리턴해 주는 것이 바로 sapply이다. 


sapply

sapply에서 s는 simplify를 나타낸다. 즉, 결과를 벡터 형태로 단순화해서 리턴한다는 것이다. 

위에서 as.double(x_list)를 통해 길이가 2인 벡터를 가져오는 부분을 sapply로 한번에 처리하면 다음과 같다. 


즉, sapply는 lapply와 동일하게 리스트를 입력으로 받아서 각각의 항목에 지정된 함수를 적용한다. 

다만 유일한 차이점은 결과값을 리스트가 아닌 벡터 형태로 리턴한다는 점이다. 


다음 예제를 한번 생각해보자. 

lapply에 적용하는 함수를 익명함수로 각각의 원래 값에 1을 더하는 것으로 적용해보면 다음과 같다. 


결과를 보면 리스트 각각의 길이가 서로 다르다. 

이 경우, 과연 sapply를 적용하면 어떻게 될까? 

길이가 다르기 때문에 하나의 벡터로 합치는 것이 어렵다. 그래서 다음과 같이 sapply도 lapply와 동일하게 리스트를 리턴하게 된다. 


vapply

벡터로 결과를 가져오는 것을 기대했는데, 위처럼 리스트가 결과로 나타나면 문제가 되는 경우도 있다. 

이런 경우, 차라리 결과가 나오지 않고 에러를 발생하는 것이 필요할 수도 있다. 


이럴때 사용하는 것이 바로 vapply이다. 

vapply는 함수 결과값의 벡터 형태를 미리 지정하고, 해당 형태가 아닐 경우, 에러를 발생시킨다. 


결과값이 동일한 mean 함수를 적용할 때는 sapply와 똑같이 결과가 나왔지만, 

결과값이 서로 다른 익명 함수에서는 에러가 발생한 것을 확인할 수 있다. 


미니의 R 주요 강좌...

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

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

R 데이터 구조에 대한 정리

R 패키지 설치하기

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

R 데이터셋 정렬하기~

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

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

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

R의 split 활용

R의 함수 작성 및 활용~

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

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

R 디버깅 툴 활용하기~


신고



Trackback 0 And Comment 0