前言
在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对相应的字段进行排序即可。