楼主: manfanshe
1447 6

R语言关于apply和矩阵运算提速问题 [推广有奖]

  • 1关注
  • 0粉丝

初中生

47%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
178 点
帖子
10
精华
0
在线时间
15 小时
注册时间
2015-3-9
最后登录
2017-5-3

楼主
manfanshe 发表于 2017-4-28 10:41:22 来自手机 |只看作者 |坛友微信交流群|倒序 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
代码如下,跑了两个小时~请问有没有哪些地方可以优化?谢谢大神们!

#导入数据
library(xlsx)
workbook<-"D:/R-3.3.1/实例/收入测算/基础数据.xlsx"
NBEV<-read.xlsx(workbook,sheetName="NBEV")
renli<-read.xlsx(workbook,3)
BWFYP<-read.xlsx(workbook,sheetName="BWFYP")
xuqi<-read.xlsx(workbook,9)
jxlv<-read.xlsx(workbook,10)
qita<-read.xlsx(workbook,11)
chuyong<-read.xlsx(workbook,4)
xljt<-read.xlsx(workbook,5)
wangxiao<-read.xlsx(workbook,6)
gljt<-read.xlsx(workbook,7)
jili<-read.xlsx(workbook,8)
jili.M<-read.xlsx(workbook,13) #经理激励,常数不变
I.Jan<-read.xlsx(workbook,12)[8,2]
a.chuyong<-chuyong[,2]
b.chuyong<-chuyong[,3]
c.chuyong<-chuyong[,4] #初佣系数

a.xljt<-xljt[,2]
b.xljt<-xljt[,3] #训练津贴系数

a.wangxiao<-wangxiao[,2] #网销系数

a.gljt<-gljt[,2]
b.gljt<-gljt[,3]
c.gljt<-gljt[,4] #管理津贴系数

a.jili<-jili[,2] #激励系数,除去经理

#正式1年内NBEV每月增长i/100
#正式1-2年NBEV每月增长j/100
#正式2年以上NBEV每月增长k/100
i<-0:50
j<-0:50
k<-0:50
Percent<-expand.grid(i,j,k)
new.NBEV<-as.data.frame(matrix(0.00000001,nrow=8,ncol=11))
NBEV0<-as.data.frame(matrix(0,nrow=8,ncol=11))
myfun<-function(x){
newN7<-NBEV[7,]-NBEV[3,]*x[1]/100-NBEV[4,]*x[2]/100-NBEV[5,]*x[3]/100
#增长后的NBEV
if(sum(newN7>0)==11){
new.NBEV[1,]<-NBEV[1,]
new.NBEV[2,]<-NBEV[2,]
new.NBEV[3,]<- NBEV[3,]*(1+x[1]/100)
new.NBEV[4,]<- NBEV[4,]*(1+x[2]/100)
new.NBEV[5,]<- NBEV[5,]*(1+x[3]/100)
new.NBEV[6,]<-NBEV[6,]
new.NBEV[8,]<-NBEV[8,]
new.NBEV[7,]<-NBEV[7,]-NBEV[3,]*x[1]/100-NBEV[4,]*x[2]/100-NBEV[5,]*x[3]/100
}
rj.NBEV<-new.NBEV*10000/renli #新的人均NBEV

#计算初佣收入
I.chuyong<-a.chuyong*rj.NBEV^2+b.chuyong*rj.NBEV+c.chuyong
#训练津贴
I.xljt<-a.xljt*log(rj.NBEV)+b.xljt
#网销
I.wangxiao<-a.wangxiao*BWFYP
#管理津贴
NBEV0[6,]<-apply(new.NBEV[1:5,],2,sum)
NBEV0[7,]<-apply(new.NBEV[1:6,],2,sum)
I.gljt<-a.gljt*NBEV0^2++b.gljt*NBEV0+c.gljt
#激励
I.jili<-a.jili*new.NBEV+jili.M

#总收入
Income0<-I.chuyong*renli+I.xljt*renli+I.wangxiao*10000+I.gljt*10000+I.jili*10000+xuqi*renli+jxlv*renli+qita
Income<-sum(apply(Income0[1:7,],2,sum))/10000+I.Jan
lab<-c(x[1],x[2],x[3],Income)
return(lab)
}
timestart<-Sys.time();
y<-apply(Percent,1,myfun)
timeend<-Sys.time()
runningtime<-timeend-timestart
print(runningtime)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:apply 矩阵运算 appl App R语言

沙发
番茄爱吃鱼 发表于 2017-4-28 10:44:42 |只看作者 |坛友微信交流群
不错 学习学习~~~

使用道具

藤椅
manfanshe 发表于 2017-4-28 10:49:18 |只看作者 |坛友微信交流群
&lt;应该是<
复制过来有些符号乱码了

使用道具

板凳
manfanshe 发表于 2017-4-28 10:50:30 |只看作者 |坛友微信交流群
#导入数据
library(xlsx)
workbook<-"D:/R-3.3.1/实例/收入测算/基础数据.xlsx"
NBEV<-read.xlsx(workbook,sheetName="NBEV")
renli<-read.xlsx(workbook,3)
BWFYP<-read.xlsx(workbook,sheetName="BWFYP")
xuqi<-read.xlsx(workbook,9)
jxlv<-read.xlsx(workbook,10)
qita<-read.xlsx(workbook,11)
chuyong<-read.xlsx(workbook,4)
xljt<-read.xlsx(workbook,5)
wangxiao<-read.xlsx(workbook,6)
gljt<-read.xlsx(workbook,7)
jili<-read.xlsx(workbook,8)
jili.M<-read.xlsx(workbook,13) #经理激励,常数不变
I.Jan<-read.xlsx(workbook,12)[8,2]

a.chuyong<-chuyong[,2]
b.chuyong<-chuyong[,3]
c.chuyong<-chuyong[,4] #初佣系数

a.xljt<-xljt[,2]
b.xljt<-xljt[,3]   #训练津贴系数

a.wangxiao<-wangxiao[,2]  #网销系数

a.gljt<-gljt[,2]
b.gljt<-gljt[,3]
c.gljt<-gljt[,4] #管理津贴系数

a.jili<-jili[,2] #激励系数,除去经理

#正式1年内NBEV每月增长i/100
#正式1-2年NBEV每月增长j/100
#正式2年以上NBEV每月增长k/100
i<-0:50
j<-0:50
k<-0:50
Percent<-expand.grid(i,j,k)
new.NBEV<-as.data.frame(matrix(0.00000001,nrow=8,ncol=11))
NBEV0<-as.data.frame(matrix(0,nrow=8,ncol=11))
myfun<-function(x){
newN7<-NBEV[7,]-NBEV[3,]*x[1]/100-NBEV[4,]*x[2]/100-NBEV[5,]*x[3]/100
#增长后的NBEV
if(sum(newN7>0)==11){
new.NBEV[1,]<-NBEV[1,]
new.NBEV[2,]<-NBEV[2,]
new.NBEV[3,]<- NBEV[3,]*(1+x[1]/100)
new.NBEV[4,]<- NBEV[4,]*(1+x[2]/100)
new.NBEV[5,]<- NBEV[5,]*(1+x[3]/100)
new.NBEV[6,]<-NBEV[6,]
new.NBEV[8,]<-NBEV[8,]
new.NBEV[7,]<-NBEV[7,]-NBEV[3,]*x[1]/100-NBEV[4,]*x[2]/100-NBEV[5,]*x[3]/100
}
rj.NBEV<-new.NBEV*10000/renli #新的人均NBEV

#计算初佣收入
I.chuyong<-a.chuyong*rj.NBEV^2+b.chuyong*rj.NBEV+c.chuyong
#训练津贴
I.xljt<-a.xljt*log(rj.NBEV)+b.xljt
#网销
I.wangxiao<-a.wangxiao*BWFYP
#管理津贴
NBEV0[6,]<-apply(new.NBEV[1:5,],2,sum)
NBEV0[7,]<-apply(new.NBEV[1:6,],2,sum)
I.gljt<-a.gljt*NBEV0^2++b.gljt*NBEV0+c.gljt
#激励
I.jili<-a.jili*new.NBEV+jili.M

#总收入
Income0<-I.chuyong*renli+I.xljt*renli+I.wangxiao*10000+I.gljt*10000+I.jili*10000+xuqi*renli+jxlv*renli+qita
Income<-sum(apply(Income0[1:7,],2,sum))/10000+I.Jan
lab<-c(x[1],x[2],x[3],Income)
return(lab)
}
timestart<-Sys.time();
y<-apply(Percent,1,myfun)
timeend<-Sys.time()
runningtime<-timeend-timestart
print(runningtime)


重发一次

使用道具

报纸
manfanshe 发表于 2017-4-28 10:52:00 |只看作者 |坛友微信交流群
番茄爱吃鱼 发表于 2017-4-28 10:44
不错 学习学习~~~
感觉有点慢,不知道哪里可以优化一下,共同讨论一下吧~~

使用道具

地板
stzhao 在职认证  发表于 2017-4-28 11:30:53 |只看作者 |坛友微信交流群
manfanshe 发表于 2017-4-28 10:52
感觉有点慢,不知道哪里可以优化一下,共同讨论一下吧~~
给个小建议啊,贴代码的话可以单击“<>”插入代码,易读些。read.xlsx读excel数据比较慢,试试readxl包read_excel

使用道具

7
manfanshe 发表于 2017-4-28 13:05:41 |只看作者 |坛友微信交流群
stzhao 发表于 2017-4-28 11:30
给个小建议啊,贴代码的话可以单击“”插入代码,易读些。read.xlsx读excel数据比较慢,试试readxl包read ...
恩恩,今天公司的电脑打开这个网站有问题,所以好多按钮显示不出来,所以代码就直接贴了~
我试试readxl包,谢谢~

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-25 20:03