천선생의 삶
[R] apply 함수 활용하기 - apply, sapply 본문
안녕하세요. 천선생입니다.
데이터를 다루면서 여러 연산을 하게되는데요. 이때, 반복구문을 활용해서 연산을 해도 되지만
하나씩 접근하여 연산하기 때문에 복잡한 연산이나 큰 데이터에서는 오랜 시간 연산하게됩니다.
이번 포스트에서는 벡터기반 연산을 지원하는 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계열 함수들을 다시한번 소개시켜드리도록 하겠습니다.
'Data Analysis > R Basic' 카테고리의 다른 글
[R] 데이터 핸들링 쉽게하기 - dplyr (0) | 2019.09.01 |
---|---|
[R] 시각화 시작하기 - ggplot2 (0) | 2019.07.23 |
[R] 사용자 정의 함수 활용하기 - function (0) | 2019.07.12 |
[R] 반복문 활용하기 - for, while (0) | 2019.07.11 |
[R] 조건문 활용하기 - if, else, if else (0) | 2019.07.10 |