全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
4309 8
2014-11-30
悬赏 100 个论坛币 未解决
现有数据集data1共5列数据,分别是stk,date,dir,vol,size,其中size取值包括1,2,3,
问题:现在首先将所有样本按照size分为三组,在每组中根据vol确定每组p10、p20、p80、p90的分位点,在size=1,2,3三组中,分别根据每组p10、p20、p80、p90的分位点分为5组
由于数据集文件比较大,我希望能通过宏以及proc format来提高运行效率,但目前我只晓得单变量分组,对于交叉分组一时不晓得怎么处理,哪位高手能有高效一点的方法?


二维码

扫码加我 拉你入群

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

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

全部回复
2014-11-30 23:12:23
proc univariate noprint data=data1;
var vol;
output out=quintile pctlpts=10 20 80 90 pctlpre=pct;
by size;
run;
proc sort data=data1;
        by size;

data data1;
merge data1 quintile;
        by size;
        if .<vol<=pct20 then group=1;
        if pct20<vol<=pct80 then group=2;
        if pct80<vol<=pct90 then group=3;
        if pct90<vol then group=4;
run;
二维码

扫码加我 拉你入群

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

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

2014-12-1 00:07:41
四个点分成四组?京剧
二维码

扫码加我 拉你入群

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

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

2014-12-1 00:10:14
jl60156 发表于 2014-11-30 23:12
proc univariate noprint data=data1;
var vol;
output out=quintile pctlpts=10 20 80 90 pctlpre=pct;
...
谢谢jl60156,我明白你的思路,但是我的数据集文件太大,运行一次proc sort 或proc merge花费时间特别长,这样处理起来效率特别低,我希望能通过宏以及proc format来提高运行效率,我只晓得单变量分组,对于交叉分组一时不晓得怎么处理,你能有更高效一点的方法吗?
二维码

扫码加我 拉你入群

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

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

2014-12-1 00:15:53
jingju11 发表于 2014-12-1 00:07
四个点分成四组?京剧
四个点分成五组,写错了
二维码

扫码加我 拉你入群

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

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

2014-12-1 01:35:58
try hash object, it might improve processing speed.


proc univariate noprint data=data1;
var vol;
output out=quintile pctlpts=10 20 80 90 pctlpre=pct;
by size;
run;
data data2;
attrib
pct10 length=8
pct20 length=8
pct80 length=8
pct90 length=8
group length=8;
if _n_=1 then do;
declare hash p(dataset: 'quintile(rename=(size=id))',ordered: 'yes');
declare hiter pi('p');
p.definekey('id');
p.definedata('id','pct10','pct20','pct80','pct90');
p.definedone();
call missing(id,vol,pct10,pct20,pct80,pct90,group);
end;
keep size dir date stk vol group;
set data1;
rc=pi.setcur(key: size);
do until(rc ne 0 or size ne id);
        if rc=0 then do;
                if .<vol<=pct10 then group=1;
                if pct10<vol<=pct20 then group=2;
                if pct20<vol<=pct80 then group=3;
                if pct80<vol<=pct90 then group=4;
                if pct90<vol then group=5;
end;
rc=pi.next();
end;
run;
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群