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语言的作为高级语言有很多现成的函数可用,使用起来也是相当的简单,多了解一些以后使用起来会很方便。
网友评论