데이터 나누고 바꾸고 붙이기 - apply 함수
R을 공부하면서 혼돈이 오는 파트중 하나가 바로 이 apply
친구들을 마주쳤을 때입니다.
열공해보도록 합시다.
apply 패밀리
R에는 다양한 Apply 들이 있습니다. tapply
, lapply
, mapply
와 같은 관련 함수들이 내장되어 있다고 합니다.
apply
-
apply
는 Matrix에 대해서만 사용될 수 있습니다. 이는 모든 원소가 Character, numeric, logical 중 어느 것이든지 같은 형이어야만 합니다. -
apply
인자 설명apply(theMatrix, 2, sum)
- 첫번째 인자 : 다루고자 하는 객체입니다.
- 두번째 인자 : 함수를 어느기준으로 적용해야할지 지정하는 인자입니다.(1은 행단위 2는 열단위)
- 세번째 인자 : 적용하고자 하는 함수입니다.
#행렬생성
theMatrix <- matrix(1:9, nrow = 3)
#행렬 프린트
theMatrix
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
#행을 합한다
apply(theMatrix, 1, sum)
## [1] 12 15 18
#열을 합한다
apply(theMatrix, 2, sum)
## [1] 6 15 24
# 결측치 다루어보기 위해 임의로 NA 만들어보기
theMatrix[2, 1] <- NA
apply(theMatrix, 1, sum)
## [1] 12 NA 18
#NA 값 제거하고 apply 수행
apply(theMatrix, 1, sum, na.rm = TRUE)
## [1] 12 13 18
lapply
lapply
는 list의 각 원소에 함수를 적용하고, list 로 그 결과를 리턴합니다.
# 리스트를 만듭니다. 안에 matrix 도 들어있고 숫자도 들어있고 다양한 아이들이 들어있습니다.
theList <- list(A = matrix(1:9, 3), B = 1:5,
C = matrix(1:4, 2), D = 2)
# 잘 만들었는지 확인해봅니다.
theList
## $A
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
##
## $B
## [1] 1 2 3 4 5
##
## $C
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
##
## $D
## [1] 2
# 정말 List 각 원소를 더해줍니다. List Apply 여서 lapply 인가봅니다.
lapply(theList, sum)
## $A
## [1] 45
##
## $B
## [1] 15
##
## $C
## [1] 10
##
## $D
## [1] 2
sapply
sapply
는 lapply 와 기능면에서 모든 것이 동일하며 결과값 반환이 vector 로 된다는 차이점이 있습니다.
sapply(theList, sum)
## A B C D
## 45 15 10 2
# 기술적으로 vector 는 list 이기 때문에 lapply, sapply 둘다 입력값으로 vector 를 취할 수 있습니다.
theNames <- c("AAA", "BBBBBB", "CCCCCCCC")
lapply(theNames, nchar)
## [[1]]
## [1] 3
##
## [[2]]
## [1] 6
##
## [[3]]
## [1] 8
mapply
mapply
는 여러 리스트의 각 원소에 대해 함수를 적용한다.
# 리스트 두개를 생성한다
firstList <- list(A = matrix(1:16, 4), B = matrix(1:16, 2), C = 1:5)
secondList <- list(A = matrix(1:16, 4), B = matrix(1:16, 8), C = 15:1)
#원소간 동일여부 테스트
mapply(identical, firstList, secondList)
## A B C
## TRUE FALSE FALSE
#원소 간 행의 수를 더하는 간단한 함수
simplefunc <- function(x, y) {
NROW(x) + NROW(y)
}
# 이 함수를 두 list 에 적용
mapply(simplefunc, firstList, secondList)
## A B C
## 8 10 20