巧用R中的各种排名窗口函数

前言

 在sql中巧用窗口函数可以解决很多复杂的问题,窗口函数有4种函数类型:排名函数、偏移函数、聚合函数和分布函数,详细介绍可以浏览:

                     【窗口函数】第一弹:窗口函数简介

                     【窗口函数】第二弹:排名函数和偏移函数

                     【窗口函数】第三弹:聚合函数和分布函数

    

  R语言中,也有与sql中一一对应的4种类型的窗口函数,除了聚合函数有点差异之外,其他3种类型的窗口函数完全一致,而且在R中使用管道函数书写窗口函数代码,比sql中更容易理解。分4部分讲一下:排名函数、偏移函数、聚合函数和分布函数,本节介绍一下R语言中的排名函数。


函数对比

  SQL中窗口函数语句中over语句中两个关键词:partition by和order by,R语言中也有与之一一对应的函数:

640?wx_fmt=png

    

  SQL中排名函数有4个:row_number()、rank()、dense_rank()和ntile(),R语言中也有4个排名函数与之对应,函数名也几乎相同:

640?wx_fmt=png


函数使用

  数据使用之前的数据:

640?wx_fmt=png

1 row_number函数

    R语言中的row_number函数与sql中的row_number函数相同,对group_by后面字段进行分组,按照order_by后面字段排序,生成一个连续不重复的编码,对每个客户按照购买时间升序排序编码:

640?wx_fmt=png


    输出结果与sql输出结果有一点不同:R语言中输出结果的顺序与原始数据的顺序一致,而sql中是按照购买时间的先后顺序输出的,若想输出结果与sql中一致,则:

640?wx_fmt=png

   之前说过,使用管道函数连接的语句执行顺序和书写顺序一致,上面语句可以理解为:1、使用group_by对指定的user_no字段分组;2、使用order_by函数对组内数据按照购买时间升序排列编码,增加一个新字段;3、使用arrange对指定的字段user_no和buy_date排序。

2 min_rank函数

    R语言中的min_rank函数与sql中的rank函数相同,row_number函数对order_by后面字段相同的记录编码是不同的,min_rank就是解决这个问题,对相同的记录编码相同:

640?wx_fmt=png


同样为了得到与sql中相同的输出结果,则:

640?wx_fmt=png

3 dense_rank函数

  R语言中的dense_rank函数与sql中的dense_rank函数相同,min_rank编码出现跳号现象,而dense_rank函数编码不会跳号:

640?wx_fmt=png


同样得到与sql中相同的输出结果:

640?wx_fmt=png

4 ntile函数

    R语言中的ntile函数与sql中的ntile函数相同,把每一组分成几块,块数由参数n决定:

640?wx_fmt=png


同样为了得到与sql中输出结果一致:

640?wx_fmt=png

总结

      简单介绍R语言中4个排名窗口函数,函数名几乎与sql中的4个排名窗口函数一样(除了min_rank与rank),但R语言的排名窗口函数的输出结果与sql中的输出结果有点不同:R语言的数据结果不改变原来的数据顺序,而sql中的输出结果改变了原数据的顺序,若想得到与sql中一样的输出结果,在R中使用arrange对相应的字段进行排序即可。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值