作者MmmRrrrX (银色的灵魂)
站内Statistics
标题Re: [程式] SAS 根据多变数保留最後一笔资料
时间Sat Jan 8 01:10:36 2011
※ 引述《lsshno1 (朝右边锋迈进)》之铭言:
: : proc sql;
: : create table a as select
: : a,max(b) as b,c ,d
: : from yourdata
: : group by a,c,d; /*将 a c d 看成组别分类*/
: : quit;
: 我刚刚在想,如果多加入一笔资料的话:
: a b c d
: 4 9 0756 0751
: 按照原作者的想法,应该选到下列这些资料:
: a b c d
: 1 2 0800 0759
: .
: .
: 3 5 0756 0750
: 4 8 0756 0751
: 如果按照之前各位的写法: group by a,c,d (sort,univarate,sql)
: 会选到
: a b c d
: 1 2 0800 0759
: .
: .
: .
: 3 5 0756 0750
: 3 8 0756 0751
: 4 9 0756 0751
: 这样似乎跟原作者想要的不同.
: 到现在还是没有想出来怎麽写,
: 谢谢各位了喔!
data aa;
input a b c d;
cards;
1 1 0800 0759
1 2 0800 0759
1 3 0802 0800
2 4 0750 0745
3 5 0755 0749
3 6 0756 0750
3 7 0756 0751
3 8 0756 0751
4 9 0756 0751
;
proc sort data=aa;
by c d;
run;
第一次想到的是两次 univariate 在合并
proc univariate data=aa noprint;
by c d ;
var a; output out=a1 max=a ;
proc univariate data=aa noprint;
by c d ;
var b; output out=a2 max=b ; run;
data cc;
merge a1 a2;
by c d;
run;
proc sort data=cc;
by a b;
run;
不过後来又想到,这只有在 a b 都是递增的条件下可以用 max=
如果一个递增,另一个是乱排的,有可能找不出通式
之後试了如果直接用DATA是不是做的出来
过程是瞎猫碰到死耗子写出来的,结果看起来是对的
不过不保证会不会有什麽例外
data ee;
set aa;
by c d;
if last.c or last.d then output ;
run;
proc sort data=ee;
by a b;
run;
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.172.239.38
※ 编辑: MmmRrrrX 来自: 218.172.239.38 (01/08 01:12)
1F:推 lsshno1:thank you! 01/08 02:33