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 행렬을 생성합니다.
<- matrix(sample(1:10, size=100000000, replace=TRUE), nrow=10000)
mat
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
##
##
##