R语言技巧每日分享day4-Reduce递归执行同一个函数

2023-02-23  本文已影响0人  江湾青年

你是不是也有这样的需求: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)

  1. f:代表所有执行的操作函数,例如:取交集函数intersect,也可以自己指定复杂函数
  2. x:一个列表,每个元素代表操作函数的参数

例如:Reduce(f = intersect, x = list(v1, v2, v3)),代表的意思是:

  1. x(即第二个参数)的第一个元素(即v1)和第二个元素(即v2)作为参数传给f(即intersect),结果记为v12
  2. v12x的第三个元素(即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)

参考

https://zhuanlan.zhihu.com/p/511756480

上一篇 下一篇

猜你喜欢

热点阅读