R-Language与集算器比拟——行间运算
行间计较很常见,累计,同期比,环比这些城市涉及到。R语言和集算器都有很好的行间计较本领,但又略有区别。下面这个例子涉及一些根基的行间运算,但愿通过它说明二者的区别:
某公司的销售部分但愿统计出优秀的销售员,即给公司提供前一半销售额的销售员,数据主要来自MSSQL数据库的订单表:salesOrder,主要字段包罗订单编号orderID,销售员姓名name,销售额sales,订单时间salesDate。
较量直观的解法是:
R语言的详细写法是这样的:
01 library(RODBC)
02 odbcDataSources()
03 conn<-odbcConnect(“sqlsvr”)
04 originalData<-sqlQuery(conn,’select * from salesOrder’)
05 odbcClose(conn)
06 nameSum<-aggregate(originalData$sales,list(originalData$name),sum)
07 names(nameSum)<-c(‘name’,’salesSum’)
08 orderData<-nameSum[rev(order(nameSum$salesSum)),]
09 halfSum<-sum(orderData$salesSum)/2
10 orderData$addup<-cumsum(orderData$salesSum)
11 subset(orderData,addup<=halfSum | (addup>halfSum & c( 0, addup[- length (addup)])
下面是集算器的写法:
先看看计较累计值有什么差异:
R语言在line 10利用cumsum求累计值。
集算器在A4格利用cumulate求累计值。
两者写法都很利便,但集算器的运算道理是针对每条记载,先算一遍cumulate,然后凭据行号#取得这条记载对应的累计值。而R语言是只计较一遍,因此效率上比集算器高。
把集算器的这句拆成两句可以办理效率的问题,即先单独算累计值列表,再插入到原数据会合。但这种写法又不如只需要一句代码的R语言简洁。
接着看看计较切合条件的销售员时,有什么差异:
R语言在Line 11完成这项计较,主要用了移动行的步伐,利用c( 0, addup[- length (addup)])结构了一列新数据。和addup这列对比,新列只是向下移动了一行,去掉了最后一条数据并补上了第一条的0。这样就可以举办较量了:累计值是否小于较量尺度? 可能固然大于较量尺度但上一条记载是否小于较量尺度?
R语言不能直接会见相对位置的数据,所以回收了”让相对位置的数据移到当前位置”的步伐,固然结果是一样的,但这个写法不足直观,需要阐明者具备较高的逻辑思维本领。
集算器的写法是select(addup<=B3 || (addup>B3 && addup[-1]<B3))。这是集算器特有的相对位置表达要领,即可以用[-1]这种要领暗示相对付当前记载的前1条或后几条记载。好比A4中的累计值的计较,也可以写成A3.derive(addup[-1]+salesSum:addup)。
和累计值的牢靠算法差异,这一步算法更自由。可以看到集算器的相对位置表达方法较量机动,优势较大。
通过上面的例子可以看到,相对位置和行间运算运算可以办理许多看似巨大的问题,集算器在表达相对位置时更机动,因此在举办巨大问题计较时预计会轻松很多。
R语言在整列整行的追加以及牢靠算法方面写法例越发简洁,给人留下的印象同样深刻。
本文转载自:http://www.raqsoft.cn/?p=3531