function其实也没有那么难

function其实也没有那么难

  最开始,我以为的自定义函数都是要自己写类似于高数一样的东西,后来随着接触的自定函数越来越多,我才发现,其实那种东西人家已经写过了,就是我们了解到的系统函数,包括常用的数学函数、概率函数、统计函数、矩阵运算函数和字符串函数。而我们所需要做的就是了解这些函数,然后,可以利用for的循环语句和ifelse等条件语句做出能够实现我们计算目标的自定义函数,最后再将自定义函数运用到apply族函数中,实现计算功能。

  这一点请注意!其实apply函数就是将function的功能以某种规则(行列变量)循环应用到数据上,这种循环比for或者while的效率更高,而且不用先写for的循环语句,这为我们提供更大的便利。

1.最简单的function函数,你想到了吗?

library(plyr)
data("iris")
head(iris)
test1 <- adply(iris,
      1,
      function(dat){
       dat$Sepal.Length>=5.6&dat$Species=="setosa"
      })
head(test1)
#用过apply函数,一定要检查结果格式,有些书上写的和R包更新的速度不一致,所以要动手自己检查
class(test1)
#用subset实现也完全么问题,但是就是输出的结果形式不同
head(subset(iris,Sepal.Length>=5.6&Species=="setosa"))

  为什么说这个是最简单的函数了呢?不是下回分解…哈哈,不好笑。这个是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

#利用ddply分花种计算Sepal.Width的平均值
test2 <- ddply(
  iris,
  .(Species),
  function(sub){
    sepal.width.mean=mean(sub$Sepal.Width)
  }
)
test2
class(test2)

###给新生的变量命名,就要自己手动把结果加上一个数据框
test3 <- ddply(
  iris,
  .(Species),
  function(sub){
    data.frame(sepal.width.mean=mean(sub$Sepal.Width))
  }
)
test3
class(test3)

  这里这种分组计算,我以前说过用sqldf的groupby分组计算完成,的确可以。但是领悟到了iris(数据)和function(x)中的x的关系的时候,我发现使用ddply的确是足够便利。这种便利不仅体现在计算上,而且体现在ddply、melt和ggplot2的三个函数的使用上。

3.上面那两个没有看够的话,这里还有

  list.lifes使用批读取文件夹中的文件的函数,如果你有100个文本,每10个文本存放在10个文件夹中,这样你就需要先用list.files读取最大的文件夹,还要分别读取10个子文件夹,这样的话我们就需要一个小循环。

###这往往是文本挖掘的第一步,请有心者自行收藏
files_dir=list.files("./Sample-Sougou",full.names=T)
length(files_dir)
files_dir #看一下文件路径
filedirs=files_dir[1:10]
filedirs #根据实际情况删去最后的说明文档
filedirs[1]
##遍历子文件
readsubfiles=function(x){
    list.files(filedirs[x],full.names=T)
}
fullfiles=lapply(1:length(filedirs),readsubfiles)
fullfiles_final=unlist(fullfiles)
length(fullfiles_final) #最终的全部txt文件路径
head(fullfiles_final)

更多内容关注微信公众号:R语言andSPSS

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值