Philogrammer

데이터 나누고 바꾸고 붙이기 - apply 함수

R을 공부하면서 혼돈이 오는 파트중 하나가 바로 이 apply 친구들을 마주쳤을 때입니다.

열공해보도록 합시다.

apply 패밀리

R에는 다양한 Apply 들이 있습니다. tapply, lapply, mapply 와 같은 관련 함수들이 내장되어 있다고 합니다.

apply

#행렬생성
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

# 리스트를 만듭니다. 안에 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(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

# 리스트 두개를 생성한다
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

Share this: