2014-10-09 21 views
-4
選擇特定的值

假設我有數據集是這樣的:如何SAS

value1 value2 value3 
X1  X2  X3 
Y1  Y2  Y3 
Z1  Z2  Z3 

我要選擇出Y1,Z1和X2三個新的變量。

這樣的:

a1 = Y1 
a2 = Z1 
a3 = X2 

在回答里斯,這就是我要你之後

%macro coeff(i=, j=, k=); 
data want_&k.; 
set new; 
array va(3) value1 value2 value3; 

%if &i.=1 %then %do; 
     va(_n_)=va(_n_+&j.); 
%end; 

%else %if &i.=2 %then %do; 
     va(_n_)=va(_n_+&j.); 
%end; 

keep value1; 
run; 
%mend; 

%coeff(i=1, j=1, k=1); 
%coeff(i=1, j=2, k=2); 
%coeff(i=2, j=1, k=3); 
%coeff(i=2, j=1, k=4); 
%coeff(i=3, j=-2, k=5); 
%coeff(i=3, j=-1, k=6); 

的想法,但它不工作。你可以看一下嗎?

+0

您想要更新Value1列中的當前值並使用您發佈的新值嗎? – ItalianStallion 2014-10-09 21:46:39

+1

我真的希望你花時間更徹底地解釋這個問題。邏輯沒有道理,做這件事的理由也許沒有意義。 – Reeza 2014-10-10 01:05:25

回答

0

這回答你的第一個問題,但我有一種感覺,而不是你實際上在做什麼。 我還在第二個數據集中添加了have2,也許你可以更好地解釋一下如果數據在那個結構中後面的情況。

data have; 
input value1 $ value2 $ value3 $; 
cards; 
X1  X2  X3 
Y1  Y2  Y3 
Z1  Z2  Z3 
; 
run; 

data want; 
set have; 
array va(3) value1-value3; 

if _n_=1 then va(_n_)=va(_n_+1); 

keep value1; 
run; 


data have2; 
    set have; 
    array va(3) value1-value3; 

    do i=1 to 3; 
     value=va(i); 
     row=_n_; 
     output; 
    end; 
    keep value row; 
run; 
+0

謝謝!數據集想要2正是我想要的。你可以用一個可以產生所有六種可能組合的宏寫它們嗎? – 2014-10-10 04:00:20

+0

@Lu Yu - 我將你試圖編輯的內容移到了你自己的帖子中。如果您需要提出更多的問題以至於無法提出評論,編輯自己的帖子比編輯其他人提供的答案要好。 – rmunn 2014-10-10 05:03:22

0

這對我仍然絕對沒有意義,上下文會有所幫助。

data have; 
input value1 $ value2 $ value3 $; 
cards; 
X1  X2  X3 
Y1  Y2  Y3 
Z1  Z2  Z3 
; 
run; 

data have2; 
    set have end=eof; 
    array va(3) value1-value3; 
    retain counter 2; 
    do i=1 to 3; 
     value=va(i); 
     row=_n_; 
     if eof and i=3 then counter=1; 
     output; 
     counter+1; 
    end; 
    keep value counter; 
run; 

proc sort data=have2; 
by counter; 
run; 

data have3; 
    set have2; 
    retain counter2 0; 
    if mod(counter,3)=1 then counter2+1; 
    drop counter i row; 
run; 

data _null_; 
    set have3; 
    by counter2; 
    name=cats("a",counter2); 
    if first.counter2 then do; 
     call execute ("data " || name || "; set have3; where counter2=" ||counter2|| ";run;"); 
    end; 
run;