R系列之reduce函数

这篇文章学习了R中常用函数reduce函数家族,该家族函数主要是用来对输入序列进行迭代化简的,其中包括显示最终结果的reduce函数显示迭代过程的accumulate函数以及支持3参函数的reduce2accumulate2函数

reduce函数简介

reduce函数又名化简函数,是Python和R中都有并且使用较多的函数。reduce把一个函数作用在一个序列上,这个function函数必须接收两个参数,首先reduce会将序列的前两个元素传递给函数进行运算,然后将这个运算结果再和序列的第三个元素一同传入函数再次运算,依次类推,如reduce(1:4, f)就等同于f(f(f(1, 2), 3), 4).

tidyverse中有个reduce函数,base中也有一个Reduce函数,两者功能相同,但是用法略有区别,这里学习的是tidyverse中的reduce函数(实际上是purr包中的)。


简单使用

R中接触到reduce主要是因为集合操作的需求,情形是我有三个向量,我想知道这三个向量共有的元素,intersect可以实现的是两个向量之间的交集操作,虽然可以多次执行,但是这样一来会产生中间变量,占用内存,二来也不优雅,所以就想找找简单的方法,reduce正好可以解决这个需求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
library(tidyverse)

a=1:10
b=5:15
c=8:20

# 使用嵌套的形式来求多个向量的交集
intersect(intersect(a,b),c)
[1] 8 9 10

# 使用reduce函数
reduce(list(a,b,c),intersect)
[1] 8 9 10

# 输入也可以是向量
x <- c(4, 3, 10)
reduce(x,`+`)
# 求和
[1] 17

x <- list(c(0, 1), c(2, 3), c(4, 5))
# 得到长度为2的向量
reduce(x,paste)
[1] "0 2 4" "1 3 5"


accumulate-显示reduce计算过程

reduce函数只会返回迭代的最后计算结果,而其变体accumulate可以返回每次迭代计算的中间结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 多个集合交集每次迭代的结果
accumulate(list(a,b,c),intersect)
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10

[[2]]
[1] 5 6 7 8 9 10

[[3]]
[1] 8 9 10

# 加法的每次迭代结果
accumulate(x, `+`)
[1] 4 7 17

accumulate(x,paste)
[[1]]
[1] 0 1

[[2]]
[1] "0 2" "1 3"

[[3]]
[1] "0 2 4" "1 3 5"


reduce2/accumulate2-3参函数

reduceaccumulate中的函数都是两个参数的函数,如果想要支持3个参数的函数可以使用对应的变体reduce2accumulate2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
x <- list(c(0, 1), c(2, 3), c(4, 5))
# 这里的y的长度要比x短1,不然会报错
y <- list(c(6, 7), c(8, 9))

# 执行粘贴操作
accumulate2(x, y, paste)
[[1]]
[1] 0 1

[[2]]
[1] "0 2 6" "1 3 7"

[[3]]
[1] "0 2 6 4 8" "1 3 7 5 9"

reduce2(x, y, paste)
[1] "0 2 6 4 8" "1 3 7 5 9"

# 如果y的长度和x等长
y <- list(c(6, 7), c(8, 9),c(10,11))
accumulate2(x, y, paste)
Error in reduce2_impl(.x, .y, .f, ..., .init = .init, .acc = TRUE) :
`.y` does not have length 2

需要注意的是reduce2accumulate2传入的x和y是不等长的,具体计算过程是x中的第一个、第二个元素和y中的第一个元素得到结果,然后将这个结果和x中的第三个元素以及y中的第二个元素再次运算,以此类推。


参考链接



-----本文结束感谢您的阅读-----

本文标题:R系列之reduce函数

文章作者:showteeth

发布时间:2020年04月03日 - 22:57

最后更新:2020年04月04日 - 16:23

原始链接:http://showteeth.tech/posts/3019.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%