楼主: dream_2016
3980 8

关于SAS数据集交叉分组问题 [推广有奖]

  • 12关注
  • 2粉丝

讲师

35%

还不是VIP/贵宾

-

威望
0
论坛币
3010 个
通用积分
7.9600
学术水平
8 点
热心指数
12 点
信用等级
8 点
经验
4580 点
帖子
187
精华
0
在线时间
757 小时
注册时间
2009-3-5
最后登录
2024-4-17

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来提高运行效率,但目前我只晓得单变量分组,对于交叉分组一时不晓得怎么处理,哪位高手能有高效一点的方法?


关键词:sas数据集 数据集 format FORMA size 样本

回帖推荐

jl60156 发表于2楼  查看完整内容

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 .
沙发
jl60156 发表于 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;

使用道具

藤椅
jingju11 发表于 2014-12-1 00:07:41 |只看作者 |坛友微信交流群
四个点分成四组?京剧

使用道具

板凳
dream_2016 发表于 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来提高运行效率,我只晓得单变量分组,对于交叉分组一时不晓得怎么处理,你能有更高效一点的方法吗?

使用道具

报纸
dream_2016 发表于 2014-12-1 00:15:53 |只看作者 |坛友微信交流群
jingju11 发表于 2014-12-1 00:07
四个点分成四组?京剧
四个点分成五组,写错了

使用道具

地板
jl60156 发表于 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;
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
jingju11 + 5 + 5 + 5 + 5 精彩帖子

总评分: 论坛币 + 5  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

使用道具

7
jingju11 发表于 2014-12-1 10:17:10 |只看作者 |坛友微信交流群
dream_2016 发表于 2014-12-1 00:10
谢谢jl60156,我明白你的思路,但是我的数据集文件太大,运行一次proc sort 或proc merge花费时间特别长, ...
我用30,000,000的数据来测试,他的程序需要大概2分钟。所以在千万数量级别的数据上,效率不是问题。其中的关键很显然是排序的时间。如果更大的数据,是否可以排序。所以他的两个程序的差距其实只是10-20秒而已(因为这两个程序都没有避免排序)。
其中避免直接排序的方法是利用where语句每个size分别来做。然后整合到一起。
另外merge 语句在sas里不存在效率问题。而对merge效率的不满,就是对SAS软件本身结构的不满。
通过宏以及proc format来提高运行效率在这里是不切合实际的。红本身不提高程序的运行效率。而format在这里无从提起。
京剧

使用道具

8
dream_2016 发表于 2014-12-1 15:07:58 |只看作者 |坛友微信交流群
jingju11 发表于 2014-12-1 10:17
我用30,000,000的数据来测试,他的程序需要大概2分钟。所以在千万数量级别的数据上,效率不是问题。其中的 ...
我的数据集大都在1、2亿条,我用其中一个数据集排序试了下要半个小时左右

使用道具

9
sas9.4 发表于 2014-12-11 10:44:41 |只看作者 |坛友微信交流群
如果可以把数据发我试试,baidu网盘啥的都行

使用道具

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

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

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

GMT+8, 2024-5-11 07:43