18.5 그 밖의 유용한 apply-류 함수들

루프를 명시적으로 생성해야 하는 필요성을 최소화하는 벡터화된 함수를 제공하는 [apply 함수군] (http://uc-r.github.io/apply_family#apply_family) 외에도 일반적으로 적용할 수 있는 더욱 단순화된 apply류의 몇 가지 함수가 있습니다. 여기에는 전체 데이터 세트에 대한 열과 행의 합계, 평균, 중앙값, 표준 편차, 분산 그리고 요약 백분위수 계산 등이 포함됩니다.

가장 일반적인 apply 함수에는 열과 행의 합계와 평균 계산이 포함됩니다. 예를 들어 데이터 프레임 또는 행렬에서 열의 합계를 계산하려면 다음과 같이 실행할 수 있습니다.

# mtcars 데이터 세트를 예로 들겠습니다.
head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
apply(mtcars, 2, sum)
##      mpg      cyl     disp       hp     drat       wt     qsec       vs 
##  642.900  198.000 7383.100 4694.000  115.090  102.952  571.160   14.000 
##       am     gear     carb 
##   13.000  118.000   90.000

그러나 더 간결한 colSums()함수로 동일한 기능을 수행할 수 있으며 실행속도도 더 빠릅니다.

colSums(mtcars)
##      mpg      cyl     disp       hp     drat       wt     qsec       vs 
##  642.900  198.000 7383.100 4694.000  115.090  102.952  571.160   14.000 
##       am     gear     carb 
##   13.000  118.000   90.000

To illustrate the speed difference we can compare the performance of using the apply() function versus the colSums() function on a matrix with 100 million values (10K x 10K). You can see that the speed of colSums() is significantly faster.

속도 차이를 확인하기 위해 1 억 개의 값(10K x 10K)이 있는 행렬에 apply() 함수와 colSums() 함수를 적용하여 성능을 비교해 보겠습니다. 그 결과로 colSums()의 속도가 훨씬 빠르다는 것을 알 수 있습니다.

# 10,000 x 10,000 행렬을 생성합니다.
mat <- matrix(sample(1:10, size=100000000, replace=TRUE), nrow=10000)

system.time(apply(mat, 2, sum))
##    user  system elapsed 
##    1.45    0.19    1.64
system.time(colSums(mat))
##    user  system elapsed 
##    0.09    0.00    0.09

Base R은 다음과 같은 단순화된 apply 함수를 제공합니다.

  • colSums (x, na.rm = FALSE)
  • rowSums (x, na.rm = FALSE)
  • colMeans(x, na.rm = FALSE)
  • rowMeans(x, na.rm = FALSE)

또한 다음의 패키지들도 다음의 함수를 제공합니다.

  • miscTools 패키지

    (다음의 함수들은 데이터 프레임에서 작동될 것입니다)

    • colMedians()
  • rowMedians()

  • matrixStats 패키지

    (다음의 함수들은 행렬에서만 작동될 것입니다)

    • colMedians() & rowMedians()
  • colSds() & rowSds()

    • colVar() & rowVar()
    • colRanges() & rowRanges()
    • colQuantiles() & rowQuantiles()
    • 그 밖에도 여러 개의 추가적인 요약 통계 함수들이 있습니다.

또한 summary () 함수는 데이터 프레임과 행렬의 각 열에 대한 관련 요약 통계를 제공합니다. 다음의 예는 iris 데이터 세트의 처음 4 개 열에 대한 요약 통계로 최솟값, 중앙값, 평균, 최댓값, 1사분위수 그리고 3사분위수 등이 포함됩니다. 마지막 열(species)은 요인 변수이기 때문에 각 수준별 빈도수를 제공하고 있습니다.

summary(iris)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
##