본문 바로가기

Data analysis story

[R프로그래밍-apply 계열 함수(sapply함수, mapply함수, tapply함수 쉽게 이해하기+unlist 함수)

안녕하세요 여러분!

오늘은 apply 계열 함수 그 두번째 시간!!!

 

으로! 저번에 배우지 못했던 sapply, mapply, tapply 함수에 대해서 마저 다루어 보려고 합니다!

 

저번 포스팅의 apply 함수에 대한 이해가 꼭 전제되어야 하므로

전 포스팅을 꼭 완벽 숙지한 후 읽어주세요~!

 

저번 포스팅에서는 apply 함수와 lapply 함수에 대해서 자세히 살펴봤습니다!

 

이번 포스팅에서는 먼저 sapply에 대해서 배워볼게요!

③ sapply

저번 시간에 마지막으로 배운 lapply는 값을 리스트로 돌려주기 때문에

바로 가져다 쓰기에 조금 불편했습니다.

 

변수로 지정 후 $ 연산을 활용해서 하나씩 불러와야만 했죠!

 

가능한 경우에 한에서 (결과들이 모두 같은 자료 형일 때만 가능해요!)

그 결과를 단순화하는 sapply를 적용할 수가 있습니다. (ssimplify인 것이죠!)

 

차이를 보여주기 위해 lapply를 적용한 값을 다시 보도록 할게요!

예를 들어 lapply는 결과가 이렇게 나왔었는데요!

 

지금 a의 결과 값과 b의 결과 값 모두 하나의 자료형만을 가지니까

sapply를 적용해 볼 수 있습니다!

 

sapply를 사용하면

리스트에서 key였던 것이 벡터의 이름이 되면서 이름있는 벡터로 결과 값을 돌려주네요!

 

이것의 좋은 점은 벡터로 결과를 출력하기 때문에

이 결과 값에다가 또 mean 같은 함수를 바로 적용할 수가 있는 것이죠!

 

리스트로 돌려주면 바로 mean과 같은 함수를 적용하지 못하잖아요!

 

+) 팁을 드리자면 위의 예 같이 리스트가 한 가지 데이터 타입만으로 되어 있다면

그냥 lapply를 사용해서 list로 결과 값을 뽑은 후

unlist 함수를 써서 list 데이터 타입을 해제해 줄 수도 있답니다!


, 그럼 이제 sapply에 대해서 더 자세히 보도록 하죠

sapply(data,function,simplify=T/F)

이렇게 사용하는데요!

 

입력 값으로는 ‘벡터, 리스트, 데이터 프레임’이 가능하고

출력 값으로는 ‘벡터, 리스트, 매트릭스 형태’로 결과를 반환할 수가 있습니다.

만약에 인수 simplify가 F이면 ‘리스트’로 결과가 반환됩니다.

 

무슨 말인지 전혀 모르겠죠!

지금은 이해가 안될 테니 예시를 통해 알아보도록 합시다!

 

제일 먼저 벡터를 입력하고 벡터를 출력해주는 예를 보겠습니다.

(function이 간단해서 그냥 sapply함수 안에다 넣었습니다!)

 

벡터를 입력했고 sapply 함수를 이용해서 벡터로 값이 출력되었네요!

 

이럴 때도 sapply함수를 씁니다!

결과는

이렇게 나오겠죠?

만약 여기에 simplify=F라는 인수를 넣어주면

리스트로 결과가 반환된다고 했으니

한번 넣어서 결과를 봅시다!

정말 리스트로 결과를 출력하네요!!

 

그러면 리스트를 입력하는 경우를 살펴볼게요!

 

리스트 타입인 z를 일단 만들고

lapplysapply 모두 적용해보겠습니다!

그런 후 결과를 봤더니!!

? 둘 다 리스트로 출력되네요??

 

아니 아까 분명 sapply를 사용해서 리스트를 이름있는 벡터로 만들었는데

이게 어떻게 된 일이죠??

 

앞선 예제와의 차이는 바로 데이터의 길이에 있습니다.

앞선 예제에서는 mean 함수를 적용했기 때문에

리스트의 모든 key의 value에 mean함수를 적용해 딱 하나의 값만 나오게 되었었죠!

이렇게요!

a1개의 값 b1개의 값이잖아요!

 

하지만 이번에는 그냥 모든 keyvalue1을 더하는 것이기 때문에

key마다 길이가 다릅니다!

 

z x 5개의 결과가 나올 것이구요

y4개의 결과가 나오겠죠?

 

따라서 벡터로 합치기 어려워 리스트로 출력되는 것입니다!

 

그러면 sapply를 쓸 때 리스트를 입력 값으로 넣으면 리스트가 나올 수도 있고

또 이름이 붙은 벡터가 나올 수도 있네요!!

 

만약에 xy의 데이터의 길이가 같다면!

이렇다면!

그러면 결과는 어떨까요?

이때는 합쳐질 수 있으므로!

그런데 다섯개의 데이터가 각각 들어가야 하므로!

key가 열 이름으로 붙은 매트릭스로 출력이 되는 것이죠!

한 번 직접 해보는 것을 추천드려요!!


이때도 simplify=F라는 인수를 주면

이렇게 리스트로 반환한답니다!

 

그러면 이제 데이터프레임을 sapply에 넣어볼게요!

이번에는 예로 mtcars 데이터에서 1행부터 3행만 가져와볼게요!

이런 데이터프레임이 있을 때

 

역시나 lapply를 적용할 수 있는 이유는

데이터프레임은 열 별로 보았을 때 리스트라고 생각해도 되기 때문이죠!

 

평균을 lapply 함수를 사용해서 적용하면

이런 식으로 리스트로 나올 것이고요 (위 그림은 일부만 캡쳐한 것이에요!)

 

똑 같은 예제에 sapply를 적용하면

이렇게 나오겠죠?? (위 그림은 일부만 캡쳐한 것이에요!)

keyname이 된 벡터 형태로요!

데이터의 길이가 하나로 다 같잖아요!

 

그런데 1씩 더하는 함수를 sapply로 데이터프레임에 적용하면

이렇게 매트릭스 형태가 나올 겁니다!

(일단 데이터프레임을 만들기 위해서는 모든 열에 속하는 데이터의 길이가 같아야 하죠?

그래서 리스트로는 반환하지 않겠죠!)

 

역시나

이렇게 인수를 주면

매트릭스가 아닌 리스트로 반환합니다!

 

여기까지가 가장 apply 계열 함수에서 가장 많이 쓰는

apply, lapply, sapply 함수입니다!

 

④ tapply

tapply에서 t구분 지어주겠다라는 뜻입니다.

 

벡터의 subset에다 적용하는 함수인데요 subset종류별로 적용하겠다는 뜻인거죠.

 

tapply (X, IINDEX, function)

이렇게 사용합니다.

 

X는 벡터이고, 여기서 INDEXfactor인데요

(factor가 무엇인지 다들 기억나시죠? [R프로그래밍-factor] 편을 참고하세요!)

INDEX에 따라서 함수를 적용하겠다는 뜻입니다.

예를 들어 봅시다!

 

일단 R에 내장되어 있는 데이터 중 iris는 꽃에 대한 데이터인데요!

 

iris 데이터의 ‘Sepal.Length’라는 변수에는 꽃받침의 길이에 대한 데이터가

‘Species’라는 변수에는 꽃의 종류에 대한 데이터가 들어있습니다.

꽃받침의 길이와 종류를 살짝 볼 수 있죠?

 

종류에 따른 길이의 평균을 보고 싶을 때!

바로 이 tapply를 사용합니다.

바로 이렇게 말이죠!

또는 학년 별 과제 성적의 평균, 월 별 매출 합 등등을 쉽게 구할 수 있다는 것이죠!

이런 경우가 굉장히 많기 때문에

다음 시간에 배울 aggregate dplyr 패키지를 통해서도 구할 수 있습니다!

 

그러니까 정리하면 tapply는 그룹으로 묶은 후 함수를 적용하고,

적용 값을 벡터나 행렬로 반환합니다!

 

⑤ mapply

드디어 마지막! mapply 함수네요!

매개 변수를 여러 개를 주어서 적용하고 싶을 때 쓰는 것이 mapply 함수인데

예를 통해 알아봅시다.

이런 식으로 list를 만들고 싶을 때

가만히 보면 rep이라는 함수가 반복해서 쓰였는데

매개 변수 두 개가 바뀌어가면서 쓰였죠.

 

매개 변수를 바꾸어 가면서 적용하고 싶을 때

이런 식으로 mapply를 적용할 수 있다는 것입니다.

 

mapplysapply의 확장된 버전으로

여러 개의 벡터 또는 리스트를 인자로 받아

함수에 각 데이터의 첫째 요소들을 적용한 결과, 둘째 요소들을 적용한 결과, 셋째 요소들을 적용한 결과

등을 반환합니다.

 

다른 예를들면

이렇게 여러 개의 리스트를 인자로 받아서

함수를 각각을 적용햐여 결과를 돌려준답니다!

 

이렇게 해서 apply함수와 apply 계열 함수를 모두 살펴보았는데요!

다음 시간에는 tapply와 비슷하게 사용할 수 있는

또 하나의 강력한 함수 aggregate 함수를 가지고 돌아오겠습니다!!