你是不是也有这样的需求: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函数
所以,其实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)










网友评论