你是不是也有这样的需求:3个向量取交集。以前我都是这样写的:
v1 <- c("a", "b", "c")
v2 <- c("b", "c", "d")
v3 <- c("c", "d", "e")
intersect(intersect(v1, v2), v3)
貌似是能解决问题,如果有300个向量呢?这个时候就要用到Reduce函数了。
用法:Reduce(f, x)
-
f
:代表所有执行的操作函数,例如:取交集函数intersect
,也可以自己指定复杂函数 -
x
:一个列表,每个元素代表操作函数的参数
例如:Reduce(f = intersect, x = list(v1, v2, v3))
,代表的意思是:
- 把
x
(即第二个参数)的第一个元素(即v1
)和第二个元素(即v2
)作为参数传给f
(即intersect
),结果记为v12
- 把
v12
和x
的第三个元素(即v3
)作为参数传给f
,得到结果作为最终结果
如果x
的长度大于3,也是一样的按照上述步骤执行。下面的图可能更容易理解:

所以,其实Reduce(intersect, list(v1, v2, v3))
和intersect(intersect(v1, v2), v3)
是完全相同执行逻辑。
例2:将pred_list里面的每个元素按顺序连接起来,用“=”隔开
以前我是这样写的:
paste0(pred_list[[1]],'=', pred_list[[2]],'=', pred_list[[3]],'=', pred_list[[4]],'=', pred_list[[5]])
改用Reduce函数可以写成:
Reduce(f = function(x,y){paste0(x,'=',y)},x = pred_list)
网友评论