最近工作中需要处理一个实际的问题:
找出几类产品(实际上一共是10类),历史上所有日销量的极大值还有各种分位数。
处理好的表字段只有两个:产品类型,日销量。共1600万条。
本来很简单,想着用sql做个分组,公式聚合一下就完事了。估摸着10分钟肯定能搞定。
只可惜,公司用的mysql库,并没有内置中位数函数median()。
那怎么办呢?
导出来用excel吧,之前100万条数据的时候,我就分产品导出来,然后用excel搞10次。对,就是这么效率低下。胜在不用在mysql里写复杂的sql逻辑,半个小时搞定了。
可是现在,1600万条呀。excel承载不了这么大的重任,分分钟撂挑子。不,它连打开都不能。
194M的CSV。

于是,只能用好久没用的R语言了。
以下是步骤:
1、先导入数据(几秒钟搞定)
data3<-read.csv("abc0702.csv",as.is = TRUE, encoding = 'UTF-8')
不加encoding = 'UTF-8'中文会乱码。
原始数据大概长这样:

2、写个公式,算各种分位数(方法百度来的,复制粘贴,五分钟搞定。)
a <-data3[,1]
b <-data3[,2]
pf <- factor(b)
######75
qt75<-function(x){
quantile(x,0.75)
}
tapply(a,pf,qt75)
######95
qt95<-function(x){
quantile(x,0.95)
}
tapply(a,pf,qt95)
贴在这里。1秒钟就出了结果。非常优秀了。

3、在r语言中直接用sql算最大值
曾经的R语言在我面前朴实无华,我没有看到它的美好。今天使用了一下 sqldf,对我等分析师来说,简直如鱼得水。
代码如下:
library(sqldf)
sqldf("select cartype, max(amount) as amount_max
from data3
group by cartype")
不得不说,sql就是慢,等了估计七八秒,才出了结果。

综上,我的问题都已经解决了。
本来困扰我的事情,R语言用了前后20分钟帮我搞完了,中间还包括更新了下最新版本的R。
记录下。