본문 바로가기

데이터 다루기/Base of R

[R] apply 함수

728x90
반응형

안녕하세요 이번에는 apply 함수에 대해서 알아보겠습니다.

자주쓰이는 apply 함수는 apply, lapply, sapply, tapply가 있습니다.

① apply

apply

apply(X, MARGIN, FUN)

apply 함수는 행렬이나 데이터프레임을 받아들여 열이나 행에 대하여 특정 함수를 적용시키는 함수입니다. 이 때 X에는 데이터 (행렬 or 데이터프레임)이 들어가며, margin에는 1(행), 2(열) 이 들어가며 FUN은 적용시킬 함수(ex: sum, mean, summary)가 들어갑니다.

 

d <- matrix(1:9, ncol = 3) 
   [,1] [,2] [,3]
[1,] 1 4 7 
[2,] 2 5 8 
[3,] 3 6 9 

apply(d,2,mean) # 1 : row , 2 : column 
[1] 2 5 8 

d2 <- apply(iris[,1:4], 2, mean) 
d2 
Sepal.Length Sepal.Width Petal.Length Petal.Width 
  5.843333    3.057333    3.758000     1.199333

위의 예시를 보시면, 행렬 d에서 열단위로 평균값이 계산이되어 벡터형태로 출력이 된것을 볼 수 있습니다. 또한 iris 데이터의 열단위에 대하여 mean함수가 적용되 평균이 출력된것을 확인 할 수 있습니다.

② lapply

lapply

lapply(X, FUN)

lapply 함수는 데이터프레임이나 리스트를 받아들여 데이터 프레임의 경우 열에 대하여 특정 함수를 적용시키는 함수입니다. 이 때 출력값은 리스트가 됩니다.

l <- list(1:4, -4:-1, c(3,5,7)) 
[[1]]
[1] 1 2 3 4 

[[2]] 
[1] -4 -3 -2 -1 

[[3]] 
[1] 3 5 7 

lapply(l,sum) 
[[1]] 
[1] 10 

[[2]] 
[1] -10 

[[3]] 
[1] 15 

lapply(iris[,1:4], mean)
$Sepal.Length 
[1] 5.843333 

$Sepal.Width 
[1] 3.057333 

$Petal.Length 
[1] 3.758 

$Petal.Width 
[1] 1.199333 

lapply(d, mean) 
[[1]] 
[1] 1 

[[2]] 
[1] 2 

[[3]] 
[1] 3 

[[4]] 
[1] 4 

[[5]] 
[1] 5 

[[6]] 
[1] 6 

[[7]] 
[1] 7 

[[8]] 
[1] 8 

[[9]] 
[1] 9

위의 예시를 보시면, 각 리스트의 벡터들에 대하여 sum값이 리스트 타입으로 출력이 되었습니다. 또한, iris 의 열에 대하여 평균이 리스트 타입으로 출력된 것을 확인할 수 있습니다. 하지만 apply 함수와는 다르게, 행렬에 대하여는 잘 작동하지 않는것을 확인할 수 있습니다.

③ sapply

sapply

sapply(X, FUN)

sapply 함수는 lapply와 같은 기능을 하며, 단지 출력값을 리스트가 아닌 벡터로 출력해줍니다.

sapply(l, mean) 
[1] 2.5 -2.5 5.0 

sapply(iris[,1:4], mean) 
Sepal.Length Sepal.Width Petal.Length Petal.Width 
  5.843333     3.057333   3.758000     1.199333 

sapply(d, mean) 
[1] 1 2 3 4 5 6 7 8 9

위의 예시를 보시면, 앞의 lapply의 예제와 결과값은 같고, 데이터 타입이 리스트에서 벡터로 바뀐것을 확인할 수 있습니다. 마찬가지로, 행렬에 대해서는 잘 작동하지 않습니다.

④ tapply

tapply

tapply(X, index, FUN)

tapply 함수는 이전의 apply와는 다르게, 두 개의 벡터를 받아들여, index 인자를 level로 인식(따라서 연속형변수면 안됩니다)해 그룹화하여, 그룹별로 특정 함수를 적용시키는 함수 입니다. 설명으로는 이해하기 어려울 수 있으나, 예시를 보시면 쉽게 이해할 수 있을겁니다.

tapply(iris$Sepal.Length,iris$Species,mean) 
setosa versicolor virginica 
 5.006   5.936      6.588 
 
 tapply(iris$Sepal.Length,iris$Species,summary)
 $setosa 
 Min. 1st Qu. Median Mean 3rd Qu. Max. 
 4.300 4.800 5.000 5.006 5.200 5.800 
 
 $versicolor 
 Min. 1st Qu. Median Mean 3rd Qu. Max. 
 4.900 5.600 5.900 5.936 6.300 7.000 
 
 $virginica 
 Min. 1st Qu. Median Mean 3rd Qu. Max. 
 4.900 6.225 6.500 6.588 6.900 7.900

위의 예시를 보시면, 첫번째로 iris의 Sepal.Length 벡터와 Species 벡터를 받아들여 Species 벡터로 그룹화하여 3개의 품종에 따라 평균값이 계산된것을 볼 수 있습니다. 두번째에는 같은 방법으로 3가지 품종에 대한 summary 결과값이 출력됩니다.

install.packages('MASS') 
library(MASS) 
tapply(Cars93$Price, Cars93$Origin, summary) 
$USA 
Min. 1st Qu. Median Mean 3rd Qu. Max. 
7.40 13.47 16.30 18.57 20.73 40.10 

$`non-USA` 
Min. 1st Qu. Median Mean 3rd Qu. Max. 
8.00 11.60 19.10 20.51 26.70 61.90

추가적인 예시를 들면, MASS 패키지를 설치한 후, MASS 패키지에 내장되어 있는 Cars93 (차의 품종에 대한 데이터) 의 Price 열을 Origin (USA, non-USA 2개의 값 존재) 으로 그룹화 하여 각 그룹에 summary 함수가 적용되 출력된것을 확인할 수 있습니다.

이 처럼 apply계열의 함수들은 열이 굉장히 많은 데이터프레임을 다룰 때, 복잡한 코딩을 한번에 처리 할 수 있다는 장점을 가지고 있기 때문에 굉장히 유용하며 자주 쓰이고 있습니다. 다들 apply계열의 함수를 마스터하시는 것을 추천드리는바 입니다.

반응형