我就在这里,不离不弃
——A·May
R-71T-83
function其实也没有那么难May2018年1月27日
最开始,我以为的自定义函数都是要自己写类似于高数一样的东西,后来随着接触的自定函数越来越多,我才发现,其实那种东西人家已经写过了,就是我们了解到的系统函数,包括常用的数学函数、概率函数、统计函数、矩阵运算函数和字符串函数。而我们所需要做的就是了解这些函数,然后,可以利用for的循环语句和ifelse等条件语句做出能够实现我们计算目标的自定义函数,最后再将自定义函数运用到apply族函数中,实现计算功能。
这一点请注意!其实apply函数就是将function的功能以某种规则(行列变量)循环应用到数据上,这种循环比for或者while的效率更高,而且不用先写for的循环语句,这为我们提供更大的便利。
1.最简单的function函数,你想到了吗?
为什么说这个是最简单的函数了呢?不是下回分解…哈哈,不好笑。这个是adply函数,参数格式为adply(data,1/2,function),在这里,我计算的是选择出Sepal.Length大于等于5且种类是setosa的花,当然我们也可以用subset(iris,Sepal.Length>=5.6&dat$Species==“setosa”)做出来,而且一点毛病没有,重点在于对function的理解。
首先是function(dat)中的dat的设置,这个参数是根据计算对象而来的,写到这里dat并没有什么实际意义,你也可以换成是sub或者就是x,没有问题。重点是iris与dat Sepal.Length>=5.6&dat Species==“setosa”之间的计算关系,这点搞清楚就好了。我们其实是iris中的数据按行(1)循环放入到function中去计算,而function的功能是按照iris的变量去条件运算。
也就是说dat Sepal.Length实际上在运算过程是等价于iris Sepal.Length的,并且,在function中并没有其他循环函数或者数学函数。所以,只要你能领悟dat和iris的等价关系,那就可以写出这样的最为简单的自定义函数。
2.加上有一个简单的函数mean
这里这种分组计算,我以前说过用sqldf的groupby分组计算完成,的确可以。但是领悟到了iris(数据)和function(x)中的x的关系的时候,我发现使用ddply的确是足够便利。这种便利不仅体现在计算上,而且体现在ddply、melt和ggplot2的三个函数的使用上。
3.上面那两个没有看够的话,这里还有
list.lifes使用批读取文件夹中的文件的函数,如果你有100个文本,每10个文本存放在10个文件夹中,这样你就需要先用list.files读取最大的文件夹,还要分别读取10个子文件夹,这样的话我们就需要一个小循环。
参考阅读
学习数据挖掘交流平台
领取 专属20元代金券
Get大咖技术交流圈