美文网首页R语言编程进阶
R: Reduce 累积迭代函数

R: Reduce 累积迭代函数

作者: 生信云笔记 | 来源:发表于2020-08-12 20:49 被阅读0次

      R语言作为数据的工具还是很受欢迎的,因为它内置了很多好用的函数,如果没有内置的函数也会第三方的包可以用,这使得R对初学者来说很友善,学习成本不高。做数据处理有时候需要使用循环,在R中有好多函数可以用来替代循环,如apply家族的函数。但今天我想说一下的是Reduce函数,那么这个函数可以用来干什么呢?下面来说一说。

      首先Reduce接受一个向量或者列表,然后需要指定一个操作函数(自定的也可以),这时Reduce函数第一次会将第一个元素直接返回,第二次将返回的结果和向量或列表的第二个元素一起传递给操作函数,如此类推一直到最后一个元素。
    那么这样的函数有什么用呢?这里说两个适合使用的场景,用起来可以省去很多事,一是累积求值,二是多个列表求交集。

    • 情况一,比如1-100累积和,结果也就是1,1+2,1+2+3.....。示例代码如下:
    #创建一个向量
    > c1 <- seq(1:100)
    > c1
      [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18
     [19]  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36
     [37]  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54
     [55]  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72
     [73]  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90
     [91]  91  92  93  94  95  96  97  98  99 100
    #该函数默认只返回最后一个值
    > Reduce(sum,c1)
    [1] 5050
    #想返回所有的值需要开启accumulate参数
    > Reduce(sum,c1,accumulate=T)
      [1]    1    3    6   10   15   21   28   36   45   55   66   78   91  105  120
     [16]  136  153  171  190  210  231  253  276  300  325  351  378  406  435  465
     [31]  496  528  561  595  630  666  703  741  780  820  861  903  946  990 1035
     [46] 1081 1128 1176 1225 1275 1326 1378 1431 1485 1540 1596 1653 1711 1770 1830
     [61] 1891 1953 2016 2080 2145 2211 2278 2346 2415 2485 2556 2628 2701 2775 2850
     [76] 2926 3003 3081 3160 3240 3321 3403 3486 3570 3655 3741 3828 3916 4005 4095
     [91] 4186 4278 4371 4465 4560 4656 4753 4851 4950 5050
    
    

    比起写循环来完成,这样求累计和是不是更方便快捷。下面再来看看另一种情况。

    • 情况二,如有多个列表求交集,示例代码如下:
    #创建三个向量
    > c1 <- letters[1:5]
    > c2 <- letters[3:8]
    > c3 <- letters[5:11]
    > c1
    [1] "a" "b" "c" "d" "e"
    > c2
    [1] "c" "d" "e" "f" "g" "h"
    > c3
    [1] "e" "f" "g" "h" "i" "j" "k"
    #三个向量的交集
    > Reduce(intersect,list(c1,c2,c3))
    [1] "e"
    

      求向量的交集是不是很方便,也许你可以选择嵌套intersect的方式来完成,当然可以用嵌套intersect来解决,可是我这里只是求3个向量的交集,如果是求100个向量的交集呢?如果还用嵌套intersect方法,那你得写循环解决了。而Reduce可以替代循环更省时省力,何乐而不为呢?

    最后

      emm,今天就分享到这里,R语言的作为高级语言有很多现成的函数可用,使用起来也是相当的简单,多了解一些以后使用起来会很方便。

    相关文章

      网友评论

        本文标题:R: Reduce 累积迭代函数

        本文链接:https://www.haomeiwen.com/subject/rwpzrktx.html