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 함수와 함께 써보겠습니다
<- list(
dfs 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
|>reduce(full_join) dfs
# 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