[R] purrr 라이브러리 내 map() 함수 이해하기

반응형
## [1] "ko_KR.UTF-8"

purrr

  • 이번 포스팅에서는 purrr 라이브러리에서 주로 다루는 함수에 대해서 정리해보겠습니다.
  • purrr 라이브러리는 tidyverse 라이브러리를 구동할 때 같이 불러오는 라이브러리 중 하나 입니다.
  • tidyverse에서 purrr를 소개하기로는.. 함수형 프로그래밍 도구(functional programming toolkit)라는 표현을 하고 있습니다.
  • 여기서는 purrr 라이브러리 내 map() 함수에서만 짧게 소개하겠습니다.



map_*()

  • 여러 함수(커스텀 함수 등을 포함)들을 적용하여 반복 계산을 조금 더 용이하게 해주는 함수입니다.
  • 일단 기본함수인 map()은 객체 .x에 대해 특정 함수 .f를 적용하여 해당 결과를 리스트로 출력해줍니다.
    • map(.x, .f)
    • lapply() 함수와 유사한 성격을 갖는다고 이해하시면 됩니다.
  • 아래 예시를 살펴보겠습니다.
tibble(iris) %>% 
  select(-Species) %>% 
  map(mean, data = .x)
## $Sepal.Length
## [1] 5.843333
## 
## $Sepal.Width
## [1] 3.057333
## 
## $Petal.Length
## [1] 3.758
## 
## $Petal.Width
## [1] 1.199333
  • 위의 결과물을 숫자형 벡터형으로 내리고 싶다면, flatten_dbl() 함수를 사용하시면 됩니다.
tibble(iris) %>% 
  select(-Species) %>% 
  map(mean, data = .x) %>% 
  flatten_dbl()
## [1] 5.843333 3.057333 3.758000 1.199333
  • 물론 flatten_dbl() 함수 없이 출력 결과물이 list 형태가 아닌 숫자형 벡터형태로 받고 싶다면 map_dbl() 함수를 사용하시면 됩니다.
    • sapply() 함수와 유사한 성격을 갖습니다.
tibble(iris) %>% 
  select(-Species) %>% 
  map_dbl(mean, data = .x)
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
##     5.843333     3.057333     3.758000     1.199333
  • 문자형으로 받고 싶다면? map_chr()
tibble(iris) %>% 
  select(-Species) %>% 
  map_chr(mean, data = .x) 
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
##   "5.843333"   "3.057333"   "3.758000"   "1.199333"
  • 데이터프레임으로 받고 싶다면? map_df()
tibble(iris) %>% 
  select(-Species) %>% 
  map_df(mean, data = .x) 
## # A tibble: 1 x 4
##   Sepal.Length Sepal.Width Petal.Length Petal.Width
##          <dbl>       <dbl>        <dbl>       <dbl>
## 1         5.84        3.06         3.76        1.20
  • 이 밖에 정수형은 map_int(), 논리형은 map_lgl() 함수를 이용하면 됩니다.

 

  • 아래 두 1번, 2번 표현의 차이를 한 번 생각해볼까요?
# 1번 
tibble(iris) %>% 
  select(-Species) %>% 
  map_dbl(~mean(.x))
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
##     5.843333     3.057333     3.758000     1.199333
# 2번 
tibble(iris) %>% 
  select(-Species) %>% 
  map_dbl(mean, data = .x)
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
##     5.843333     3.057333     3.758000     1.199333
  • 결과물은 똑같지만 map_dbl() 안에 input들이 살짝 상이합니다.
  • purrr에서는 함수에 대한 정의를 할 때 ~ 기호를 사용하여 ~이하부터는 함수라는 것을 명시할 수 있습니다.
  • 그리고 input이 되는 객체 값을 .x로 표시합니다. 아래 코드를 보면 이해가 쉬울겁니다.
a <- 1:5
a
## [1] 1 2 3 4 5
map_dbl(a, ~.x + 1)
## [1] 2 3 4 5 6
  • map을 더욱 더 쉽게 이해시켜줄만한 그림이 있어서 같이 첨부해봅니다. 출처

반응형

'tidyverse' 카테고리의 다른 글

[R] 14. 피벗팅(pivotting)  (0) 2021.07.14
[R] 13. 분산분석(ANOVA)  (0) 2021.07.14
[R] 12. 카이제곱 검정(chi-squared test)  (0) 2021.07.13
[R] 11. t-Test  (0) 2021.07.13
[R] 10. 피어슨 상관계수(Pearson's Corrleation)  (0) 2021.07.06
TAGS.

Comments