SW/R

R : apply() 함수 (개념 및 예제)

얇은생각 2019. 2. 19. 12:30
반응형

apply 함수

R 프로그래밍할 때 for 나 while을 사용하는 것을 지양해야 합니다. 그 이유는 데이터가 많고 연산이 많은 경우 처리속도가 많이 저하게 되기 때문입니다. 대신 apply 계열 함수를 이용해 반복문을 작성할 수 있습니다. matrix, data frame, list 등을 활용한 반복문은 apply 함수로 대체 가능합니다.



apply()

apply() 함수는 matrix, data frame 에서 행단위, 열단위의 작업을 쉽게 할 수 있습니다. 사용자 정의 함수도 적용할 수 있습니다.


for (i in 1:4) {
mean(iris[,i])
}

apply(iris[,1:4], 1, mean) # row 방향으로 함수적용
# [1] 2.550 2.375 2.350 2.350 2.550 2.850 2.425 2.525 2.225 2.400 2.700 2.500
# [13] 2.325 2.125 2.800 3.000 2.750 2.575 2.875 2.675 2.675 2.675 2.350 2.650
# [25] 2.575 2.450 2.600 2.600 2.550 2.425 2.425 2.675 2.725 2.825 2.425 2.400

apply(iris[,1:4], 2, mean) # col 방향으로 함수적용
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# 5.843333 3.057333 3.758000 1.199333


for문을 활용하여 열의 평균을 구할 수 있습니다. 하지만 apply() 함수를 활용할 수 있습니다. 쉽게 col 방향, row 방향의 평균을 구하는 것을 확인할 수 있습니다.



lapply()

apply() 와 유사합니다. 아래 예제를 참조해보세요. 무엇이 차이일까요? 바로 list format입니다. 출력 형태가 다른 것을 확인할 수 있습니다.


lapply(iris[,1:4], mean) # col 방향으로 함수적용됨
# $Sepal.Length
# [1] 5.843333

# $Sepal.Width
# [1] 3.057333

# $Petal.Length
# [1] 3.758

# $Petal.Width
# [1] 1.199333



sapply()

sapply()도 유사합니다. 독특한 점은 실행 결과를 vector 또는 list 로 선택할 수 있습니다. 아래 예제를 참고하세요. list 형식으로 출력하려면 simplify=F 라고 지정해야합니다.


sapply(iris[,1:4], mean) # 결과가 vector
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# 5.843333 3.057333 3.758000 1.199333
sapply(iris[,1:4], mean, simplify=F) # 결과가 list
# $Sepal.Length
# [1] 5.843333

# $Sepal.Width
# [1] 3.057333

# $Petal.Length
# [1] 3.758

# $Petal.Width
# [1] 1.199333



사용자 정의 함수를 적용한 sapply

사용자 정의 함수를 적용해 sapply를 활용할 수 있습니다. 다음 예제를 통해 컬럼별로 최대값과 최소값의 차이를 구할 수 있씁니다.


myfunc <- function (x) {
a <- max(x)
b <- min(x)
return(a-b)
}
sapply(iris[,1:4], myfunc)
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# 3.6 2.4 5.9 2.4

반응형