apply

apply
- apply(input: array, output: array)
- sapply(input: list or vector, output: vector or array)
- by
- eapply
- lapply(input: list or vector, output: list)
- rapply
- tapply(input: list or vector and factor, output: vector or array)
apply
특정 matrix or array에 함수를 적용한 뒤,
계산 결과를 방향에 따라 출력

sum과 같이 여러 데이터를 사용하는 함수의 경우,
지정한 방향으로 연산
apply(array, , )
# 1: , 2:
# apply vector (2 : matrix or array)
x<-matrix(1:9, c(3, 3))
apply(x, 1, function(x){2*x})
     [,1] [,2] [,3]
[1,]    2    4    6
[2,]    8   10   12
[3,]   14   16   18
lapply
apply는 input으로 array만 사용 가능하다.(vector 사용 불가능)
lapply를 사용하면, vector와 list에 함수 적용 가능(데이터 프레임도 list기반 s3객체이기 때문에 적용 가능)

mean과 같은 여러 데이터를 사용하는 경우, 열단위로 계산
2*x와 같이 function을 생성해서 사용하면, 각 요소별로 계산
result<-lapply(1:3, function(x){x*2})
result
[[1]]
[1] 2

[[2]]
[1] 4

[[3]]
[1] 6
sapply
sapply는 list대신 matrix or vector로 반환한다.
lapply는 list로 반환하기 때문에 unlist 과정을 거쳐야 하지만,
sapply의 결과를 바로 이용할 수 있다.
(내부적으로 lapply의 래퍼 함수임)
y<-sapply(iris[, 1:4], function(x){x>3})
#typeof(y) # logical
#class(y) # matrix
z<-sapply(iris[, 1:4], mean)
vapply
output format을 정확하게 정의할 수 있다.
y<-vapply(iris[, 1:4], function(x){x>3}, numeric(length(iris[, 1])))
tapply
그룹별 연산 처리를 할 수 있다.
그룹을 인자로 주고(factor), 원소별 처리가 아닌 그룹별 처리 실시
(그룹인자는 내부적으로 factor형으로 캐스팅해서 사용함)
tapply(1:10, rep(c(1, 2), each=5), sum)
tapply(iris$Sepal.Length, iris$Species, mean)
mapply
sapply와 유사하지만, 여러개의 인자를 사용하는 함수를 적용할 수 있다.)
함수의 인자의 개수만큼, 벡터나 리스트를 입력해 주어야 함
mapply(, , )
# function ,
mapply(function(i, s){
sprintf(" %d%s ", i, s)}, 1:3, c("a", "b", "c"))
mapply('+', iris$Sepal.Length, iris$Sepal.Width)
# mapply(function(a, b){ a+b }, iris$Sepal.Length, iris$Sepal.Width)