cover_image

【R语言】窗口函数系列一:排名窗口函数

Flash7 WorkingNotes
2019年04月18日 15:19

前言

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

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

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

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

    

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


函数对比

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


图片

    

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

图片


函数使用

   数据使用之前的数据:

图片


1 row_number函数

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


图片


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


图片


   之前说过,使用管道函数连接的语句执行顺序和书写顺序一致,上面语句可以理解为: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就是解决这个问题,对相同的记录编码相同:


图片


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


图片


3 dense_rank函数

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


图片


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


图片


4 ntile函数

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


图片


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


图片


总结

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

继续滑动看下一个
WorkingNotes
向上滑动看下一个