Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

천선생의 삶

[R] apply 함수 활용하기 - apply, sapply 본문

Data Analysis/R Basic

[R] apply 함수 활용하기 - apply, sapply

천선생 2019. 7. 14. 12:00

 안녕하세요. 천선생입니다.

 

 데이터를 다루면서 여러 연산을 하게되는데요. 이때, 반복구문을 활용해서 연산을 해도 되지만

하나씩 접근하여 연산하기 때문에 복잡한 연산이나 큰 데이터에서는 오랜 시간 연산하게됩니다.

이번 포스트에서는 벡터기반 연산을 지원하는 apply계열 함수 에대해서 알아보도록 하겠습니다.

 

- APPLY?

 apply는 배열 또는 행렬을 입력받으며 주로 2차원 데이터를 연산할 때 많이 사용되는 함수입니다.

기본 형태는 다음과 같습니다.

# apply의 기본 형태
apply(array, margin, ... )

행 / 열 값을 margin 인자에 지정해주면, 그것을 기준으로 연산을 진행하게 됩니다!

 

간단한 예를 통하여 apply가 작동하는 방식을 보여드리겠습니다.

# apply를 활용한 연산의 간단한 예제
num_iris <- iris[, 1:4] #iris 데이터의 1~4열만을 불러옵니다.(수치형)

# margin = 1 : 행단위 계산
apply(num_iris, 1, sum)
# [1] 10.2  9.5  9.4  9.4 10.2 11.4  9.7 10.1  8.9  9.6 10.8 10.0  9.3  8.5 11.2 12.0 11.0 10.3 11.5 10.7
# [21] 10.7 10.7  9.4 10.6 10.3  9.8 10.4 10.4 10.2  9.7  9.7 10.7 10.9 11.3  9.7  9.6 10.5 10.0  8.9 10.2
# [41] 10.1  8.4  9.1 10.7 11.2  9.5 10.7  9.4 10.7  9.9 16.3 15.6 16.4 13.1 15.4 14.3 15.9 11.6 15.4 13.2
# [61] 11.5 14.6 13.2 15.1 13.4 15.6 14.6 13.6 14.4 13.1 15.7 14.2 15.2 14.8 14.9 15.4 15.8 16.4 14.9 12.8
# [81] 12.8 12.6 13.6 15.4 14.4 15.5 16.0 14.3 14.0 13.3 13.7 15.1 13.6 11.6 13.8 14.1 14.1 14.7 11.7 13.9
# [101] 18.1 15.5 18.1 16.6 17.5 19.3 13.6 18.3 16.8 19.4 16.8 16.3 17.4 15.2 16.1 17.2 16.8 20.4 19.5 14.7
# [121] 18.1 15.3 19.2 15.7 17.8 18.2 15.6 15.8 16.9 17.6 18.2 20.1 17.0 15.7 15.7 19.1 17.7 16.8 15.6 17.5
# [141] 17.8 17.4 15.5 18.2 18.2 17.2 15.7 16.7 17.3 15.8
# 각 행의 합을 구한 모습입니다.

# margin = 2 : 열단위 계산
apply(num_iris, 2, sum)
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
#        876.5        458.6        563.7        179.9 
#각 열의 합을 구한 모습입니다.

 각 열은 일반적으로 변수를 의미하기때문에 이처럼 행 / 열 기준의 연산을 쉽게 할 수 있다는 점은 큰 장점입니다.

 

- LAPPLY

 lapply 함수는 입력값에 있어서 제한이 없으며, 입력값의 데이터 유형에 따라 연산을 적용할 대상을 바꿉니다.

예를들어 벡터를 입력하면 각 원소에 해당 연산을 수행하며 데이터프레임을 입력한 경우 각 컬럼별로 연산합니다.

이때, lapply 함수는 결과값을 항상 list로 리턴해주는 특징이 있습니다!

기본 형태와 함께 간단한 예시를 보여드리겠습니다.

# lapply의 기본 형태
lapply(input, function... )

# lapply를 활용한 연산의 간단한 예제
num_iris <- iris[, 1:4] #iris 데이터의 1~4열만을 불러옵니다.(수치형)

lapply(num_iris, sum)
# $Sepal.Length
# [1] 876.5
# 
# $Sepal.Width
# [1] 458.6
# 
# $Petal.Length
# [1] 563.7
# 
# $Petal.Width
# [1] 179.9
#각 컬럼별 연산을 진행하며, 리스트의 형태로 반환합니다.

 이처럼 데이터프레임을 입력하면 각 컬럼별 연산을 수행하고, 리스트를 입력하면 각 집단별 연산을 수행합니다.

 

- SAPPLY?

 sapply 함수는 lapply와 굉장히 유사합니다. 그러나 반환값을 리스트가 아닌 각 데이터에 해당하는 형태로 반환합니다.

기본 형태와 함께 간단한 예시를 보여드리겠습니다.

# sapply의 기본 형태
sapply(input, function... )

# sapply를 활용한 연산의 간단한 예제
num_iris <- iris[, 1:4] #iris 데이터의 1~4열만을 불러옵니다.(수치형)

sapply(num_iris, sum)
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
#        876.5        458.6        563.7        179.9 
#각 컬럼별 연산을 진행하며, 주어진 입력값에 대응하는 형태로 반환합니다.

 이처럼 lapply와 동일한 연산을 수행하지만, 결과값이 list가 아니라는 점에서 조금 더 유연합니다.

 

- 이게 끝이야?

 사실 이 포스트에서 다룬 활용법은 극히 일부분에 불과합니다...!

그러나 압축해서 포스트하기에 저의 능력이 부족하기때문에..

실제 데이터를 처리하는 과정에서 apply계열 함수들을 다시한번 소개시켜드리도록 하겠습니다.

Comments