※ 引述《liton (歐吉桑留學生)》之銘言:
: 幫朋友想些SAS的程式該如何寫
: 目前有個data set(source)
: 共6個欄位 (i,j,k,l,m,n 數字整數格式 已經由小到大排列)
: 想篩選出以下條件的資料
: (1).二個3連,
: 例, 2,3,4+11,12,13
: (2).三個2連,
: 例, 11,12+22,23+35,36
: (3).3單連+3偶連,
: 例, 3,5,7+12,14,16
: (4).2單連+2單連+2偶連或2單連+2偶連+2偶連的組合,
: 例, 3,5+11,13+30,32或2,4+10,12+33,35
: 我有想過用array寫
: 但是array還是逃不出要指定哪些欄位符合條件
: 例如第一題中 我必須程式中有寫到k-j, j-i
: 但是這樣的解題方法到了第二題之後只會撞牆
: 不知道有啥比較好的解法呢?
(2)
data aa;
set aa;
a1=j-i; a2=k-j; a3=l-k; a4=m-l; a5=n-m;
if a1^=1 then a1=0;
if a2^=1 then a2=0;
if a3^=1 then a3=0;
if a4^=1 then a4=0;
if a5^=1 then a5=0;
data bb;
set aa;
if a1=1 and a2=0 and a3=1 and a4=0 and a5=1 then output;
keep i j k l m n;
run;
三個2連,所以a1-a5應該要 [1 0 1 0 1] 的樣子才滿足
(3)
data aa;
set aa;
b1=j-i; b2=k-j; b3=m-l; b4=n-m;
if b1^=2 then b1=0;
if b2^=2 then b2=0;
if b3^=2 then b3=0;
if b4^=2 then b4=0;
b5=k/2;
b6=ceil(b5);
if b5^=b6 then b7=1 ; else b7=0; *b7=1 k為奇數*;
b8=l/2;
b9=ceil(b8);
if b8=b9 then b10=1 ; else b10=0; *b10=1 l為偶數*;
data cc;
set aa;
if b1=2 and b2=2 and b3=2 and b4=2 and b7=1 and b10=1 then output;
keep i j k l m n;
run;
3單連+3偶連
所以b1-b4應該是 [2 2 2 2] 的樣子才滿足
另外要驗證前三個是奇數 後三個是偶數
(只要三個裡面有一個滿足可以,不然b1-b4不會滿足 [2 2 2 2] )
因為不知道SAS有沒有直接看是不是奇數偶數的函數
所以小繞了一圈
(4)
data dd;
set aa;
a1=j-i; a2=k-j; a3=l-k; a4=n-m;
if a1^=2 then a1=0;
if a2^=2 then a2=0;
if a3^=2 then a3=0;
if a4^=2 then a4=0;
b1=j/2;
b2=ceil(b1);
if b1^=b2 then b3=1 ; else b3=0; *b3=1 j為奇數*;
b4=l/2;
b5=ceil(b4);
if b4^=b5 then b6=1 ; else b6=0; *b6=1 k為奇數*;
b7=n/2;
b8=ceil(b7);
if b7=b8 then b9=1 ; else b9=0; *b9=1 l為偶數*;
if a1=2 and a2=0 and a3=2 and a4=2 and b3=1 and b6=1 and b9=1 then output;
keep i j k l m n;
data ee;
set aa;
a1=j-i; a2=l-k; a3=m-l; a4=n-m;
if a1^=2 then a1=0;
if a2^=2 then a2=0;
if a3^=2 then a3=0;
if a4^=2 then a4=0;
b1=j/2;
b2=ceil(b1);
if b1^=b2 then b3=1 ; else b3=0; *b3=1 j為奇數*;
b4=l/2;
b5=ceil(b4);
if b4=b5 then b6=1 ; else b6=0; *b6=1 k為偶數*;
b7=n/2;
b8=ceil(b7);
if b7=b8 then b9=1 ; else b9=0; *b9=1 n為偶數*;
if a1=2 and a2=2 and a3=0 and a4=2 and b3=1 and b6=1 and b9=1 then output;
keep i j k l m n;
data ff;
set dd ee;
run;
2單連+2單連+2偶連 跟 2單連+2偶連+2偶連 分開做在合併
邏輯跟上面大同小異
沒有data可以檢查寫的對不對,
也許有小錯誤在裡面,或是沒考慮周全的
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.119.145.80
※ 編輯: MmmRrrrX 來自: 140.119.145.80 (04/07 05:03)
※ 編輯: MmmRrrrX 來自: 140.119.145.80 (04/07 13:40)