reduce() : Reduce a list to a single value

벡터 요소들을 하나의 값으로 결합하고 싶을 때
purrr
Author

chichead

Published

October 13, 2022

Today Function : reduce()

오늘의 함수는 purrr 패키지의 reduce() 함수입니다. r에서 데이터테이블을 join하거나 교집합(intersect)을 한다거나 혹은 합집합(union)을 하려면 테이블이 2개일 경우에만 가능합니다. 그래서 이런 함수들을 Two-Table Verbs라고도 하죠. 그런데 그 이상의 데이터테이블을 가지고 교집합, 합집한 등의 함수를 적용하고 싶다면 어떻게 해야할까요? 그럴 때 사용하는 함수가 바로 reduce()입니다. reduce()함수는 벡터의 요소를 하나의 값으로 결합, 반복해주는 작업을 실행합니다. 이런 식입니다. 1:3에다가 f라는 함수를 reduce()하면 f(f(1, 2), 3) 이런 식으로 적용합니다.


Usage

reduce(.x, .f, ..., .init, .dir = c("forward", "backward"))

reduce2(.x, .y, .f, ..., .init)


Argument

.x : 리스트나 atomic vector가 들어갑니다
.f : reduce() 함수에서는 Two-Table Verbs 함수가, reduce2() 함수에는 그 이상의 함수를 사용할 수 있습니다.
.dir : reduce의 방향을 정합니다.


Example

library(tidyverse)
library(purrr)

# +로 예를 들어봅시다 1부터 3까지 reduce 함수로 더해봅니다
1:3 |> reduce(`+`)
[1] 6
reduce(1:3, `+`)
[1] 6
# 이번엔 1부터 10까지 곱해보겠습니다
reduce(1:10, `*`)
[1] 3628800
# 10!과 값이 당연히 같습니다
factorial(10)
[1] 3628800
# dplyr 패키지의 join 함수를 reduce 함수와 함께 써보겠습니다
dfs <- list(
  age = tibble(name = "John", age = 30),
  sex = tibble(name = c("John", "Mary"), sex = c("M", "F")),
  trt = tibble(name = "Mary", treatment = "A")
)
dfs
$age
# A tibble: 1 × 2
  name    age
  <chr> <dbl>
1 John     30

$sex
# A tibble: 2 × 2
  name  sex  
  <chr> <chr>
1 John  M    
2 Mary  F    

$trt
# A tibble: 1 × 2
  name  treatment
  <chr> <chr>    
1 Mary  A        
dfs |>reduce(full_join)
# A tibble: 2 × 4
  name    age sex   treatment
  <chr> <dbl> <chr> <chr>    
1 John     30 M     <NA>     
2 Mary     NA F     A        


direction

reduce를 적용할 함수 f가 덧셈이나 곱셈처럼 순서가 안 중요한 함수일 수 있지만 대부분의 다른 함수에서는 순서가 중요할 수 있습니다.

# + 는 방향을 뒤로해도 결과가 달라지지 않습니다. 당연하게도
reduce(1:3, `+`)
[1] 6
reduce(1:3, `+`, .dir = "backward")
[1] 6
# 하지만 다른 함수는 순서가 중요합니다
str(reduce(1:4, list))
List of 2
 $ :List of 2
  ..$ :List of 2
  .. ..$ : int 1
  .. ..$ : int 2
  ..$ : int 3
 $ : int 4
str(reduce(1:4, list, .dir = "backward"))
List of 2
 $ : int 1
 $ :List of 2
  ..$ : int 2
  ..$ :List of 2
  .. ..$ : int 3
  .. ..$ : int 4