前言
想到这个函数,是因为希望同时处理多个数据集的交集。如果按照常规的方法就是两两交集,直到最后全部完成。但是,想着应该有类似“do.call”的函数(此函数多用于多个数据框的合并,感兴趣的可以比较一下)。于是看到了 Reduce 函数。现介绍如下。
定义
Reduce(f, x, init, right = FALSE, accumulate = FALSE)
参数
- f:一个含有两个参数的函数,可以是自定义的,也可以是R语言内置的操作符(比如,+,-,*等)
# 其余为默认参数,仅展示如何使用 ‘f’ 参数
> x <- 1:5
> Reduce("+", x)
[1] 15
> Reduce(function(a, b){a*2+b}, x)
[1] 57
注: 这是大家可能疑惑了,怎么来的?其计算过程中是先取前两个元素执行 function 操作,然后负值给 function 中的第一个参数,再从数据集中取第三个数据复制给 function 第二个参数,如此反复。。。(还是直观点吧,如下)
- x:一个向量或列表
> ## 定义三个数据框
> df1 <- data.frame(id=c(1,2,3),name=c('Joseph','Summer','dograbbit'))
> df2 <- data.frame(id=c(1,2),money=c('0','100'))
> df3 <- data.frame(id=c(1,3),looking=c('handsom','cute'))
> ## Reduce
> Reduce(function(x,y) merge(x,y,by="id",all.x=TRUE),list(df1,df2,df3),accumulate =FALSE)
id name money looking
1 1 Joseph 0 handsom
2 2 Summer 100 <NA>
3 3 dograbbit <NA> cute
- init:初始化值(与 x 中元素具有相同的数据类型)
> Reduce("+", x)
[1] 15
> Reduce("+", x, init = 10)
[1] 25
- right:是从左往右,还是从右往左 (默认FALSE)
> Reduce("+", x, init = 10, right = FALSE, accumulate = TRUE)
[1] 10 11 13 16 20 25
> Reduce("+", x, init = 10, right = TRUE, accumulate = TRUE)
[1] 25 24 22 19 15 10
- accumulate:是否保留计算过程 (默认false)