reduce(.x, .f, ..., .init, .dir = c("forward", "backward"))
reduce2(.x, .y, .f, ..., .init)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
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