R 사용자가 피해야 할 것 1 순위는 loop라고 하죠!
루프 대신 apply 함수족과 벡터화 연산을 이용할 것을 권장하는데요,
R의 내장함수가 바로 이런 역할을 하기 때문입니다.
데이터를 다룰 때, 원자별, 그룹별로 함수를 적용할 경우가 많습니다. 이런 경우에 활용도가 높은 apply 계열의 함수는 다음과 같은 특징을 지닙니다.
apply (input : array, output : array)
lapply (input : list or vector, output : list)
sapply (input : list or vector, output : vector or array)
vapply (input : list or vector, output : vector or array)
tapply (input : list or vector and factor, output : vector or array)
mapply (input : list or vector, output : vector or array)
내장함수에서 가장 많이 사용되는 apply 함수족은 다음과 같이 구성되어 있습니다. 그 중에서도 가장 활용도가 높은 apply, lapply, sapply, vapply, tapply에 대해 살펴보겠습니다.

apply 함수는 행렬의 행 또는 열 방향으로 특정 함수를 적용합니다. input으로는 array 형식만 입력 가능하며 array를 반환합니다.
usage and basic arguments
apply(X, MARGIN, FUN, ..., simplify = TRUE)
X: an array, including a matrix.
MARGIN: 1 indicates rows, 2 indicates columns
FUN: functions
compute row and column sums for a matrix
x <- cbind(x1 = 3, x2 = c(4:1, 2:5)) dimnames(x)[[1]] <- letters[1:8] apply(x, 2, mean)** #x를 column별로 mean 값 도출>x1 x2 3 3
apply 함수의 단점은 input 으로 array만 입력할 수 있다는 것입니다. 일반적으로 vector 를 input으로 넣는 경우가 많고, 이를 보완하여 lapply를 사용합니다. input으로 vector 또는 list를 받아 list 를 반환합니다.
usage and basic arguments
lapply(X, FUN, ...)
X: a vector (atomic or list)
FUN: functions
compute the list mean for each list element
x <- list(a = 1:10, beta = exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE)) lapply(x, mean)>lapply(x, mean) $a [1] 5.5 $beta [1] 4.535125 $logic [1] 0.5
sapply 는 list 대신 행렬 or 벡터로 반환합니다. lapply와 유사하나 simple한 반환이 이루어집니다.
usage and basic arguments
sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)
X: a vector (atomic or list)
FUN: functions
compute the fivenum for each element
i39 <- sapply(3:9, seq) # list of vectors sapply(i39, fivenum)> sapply(i39, fivenum) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [1,] 1.0 1.0 1 1.0 1.0 1.0 1 [2,] 1.5 1.5 2 2.0 2.5 2.5 3 [3,] 2.0 2.5 3 3.5 4.0 4.5 5 [4,] 2.5 3.5 4 5.0 5.5 6.5 7 [5,] 3.0 4.0 5 6.0 7.0 8.0 9
FUN.VALUE argument 에 output 형식을 명확히 정의하여 얻고 싶은 형태로, 더 정확한 정보를 출력할 수 있습니다.
usage and basic arguments
vapply(X, FUN, FUN.VALUE, ..., USE.NAMES = TRUE)
X: a vector (atomic or list)
FUN: functions
FUN.VALUE: template for the return value from FUN
compute the fivenum for each element with vapply
i39 <- sapply(3:9, seq) # list of vectors vapply(i39, fivenum, c(Min. = 0, "1st Qu." = 0, Median = 0, "3rd Qu." = 0, Max. = 0))> > vapply(i39, fivenum, + c(Min. = 0, "1st Qu." = 0, Median = 0, "3rd Qu." = 0, Max. = 0)) [,1] [,2] [,3] [,4] [,5] [,6] [,7] Min. 1.0 1.0 1 1.0 1.0 1.0 1 1st Qu. 1.5 1.5 2 2.0 2.5 2.5 3 Median 2.0 2.5 3 3.5 4.0 4.5 5 3rd Qu. 2.5 3.5 4 5.0 5.5 6.5 7 Max. 3.0 4.0 5 6.0 7.0 8.0 9
tapply 는 그룹별 처리를 위한 함수이다. 주로 table 차원에서 이루어지거나, 그룹을 인자로 주고 (factor 형), 원소별 처리가 아니라 그룹별 처리를 합니다.
usage and basic arguments
tapply(X, INDEX, FUN = NULL, ..., default = NA, simplify = TRUE)
X: vector, dataframe
INDEX: X에서 추출해낼 부분 or 범위
FUN: functions
compute the fivenum for each element with vapply
require(stats) groups <- as.factor(rbinom(32, n = 5, prob = 0.4)) tapply(groups, groups, length)> tapply(groups, groups, length) #- is almost the same as 8 11 13 14 17 1 1 1 1 1