推 lsshno1:thank you! 01/08 02:33
※ 引述《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)