2015-03-30 154 views
3

我想改變我的原始數據文件的輸出。在原始數據,該數據是按以下格式:SAS輸出語句

Name Test1 Test2 Test3 Test4 
xyz  45  78  88  100 
avb  -1  89  76  29 

但我希望將數據結構更改爲以下格式:

Name Score 
xyz  45 
xyz  78 
xyz  88 
xyz  100 
xyz  89 (skip -1 because it's less than 0) 

我試圖使用數組和輸出語句,但遇到麻煩。這是我的代碼:

Data Stats; 
    set Record; 
    Array Test(*) Test1 - Test 6; 
    do i = 1 to 6; 
    if Test(i) gt -1 then output; 
    end; 
run; 
+1

請提供您試過的代碼,以便我們提供有用的反饋。 – Joe 2015-03-30 21:17:40

+0

我使用的代碼是 Data Stats; 設置記錄; Array Test(*)Test1 - Test 6; do i = 1至6; if test(i)gt -1 then then output; 結束; 謝謝 – Sam 2015-03-30 21:32:39

+1

請在將來編輯該問題。 – Joe 2015-03-30 21:49:19

回答

5

你缺少的是將值移動到一個列中。現在你得到的行數是正確的,但你沒有得到單列。

Data Stats; 
    set Record; 
    Array Test(*) Test1 - Test 6; 
    do i = 1 to 6; 
    if Test(i) gt -1 then do; 
     score=test(i); *save value onto Score variable; 
     output; 
    end; 
    end; 
    keep score name; *only keep the two variables you want; 
run; 
+0

非常感謝。它現在很好:) – Sam 2015-03-30 22:03:16

2

您可以使用proc轉置或帶有do循環的Array語句來解決您的問題。

data record; 
infile datalines missover; 
input Name $ Test1 Test2 Test3 Test4; 
datalines; 
xyz  45  78  88  100 
avb  -1  89  76  29 
;;;; 
run; 

/* Solution #1 : Using PROC TRANSPOSE */ 
proc transpose data=record out=solution_1(rename=(col1=score) where=(score>0) drop=_name_); 
by notsorted name; 
var test1--test4; 
run; 
proc print data=solution_1;run; 


/* Solution # 2 : Using Array and do loop */ 
data solution_2; 
set record; 
array temp(*) test1-test4; 

do i=1 to dim(temp); 
score=temp[i]; 
if score >0 then output; 
end; 
keep name score; 
run; 
proc print data=solution_2;run; 
+0

謝謝你的幫助 – Sam 2015-03-30 22:03:34

1

您可以用非常簡單的方法解決這個問題。

data original; 

    input Name $ Test1-Test4; 

    cards; 

    xyz 45 78 88 100 

    avb -1 89 76 29 
    ; 

    run; 



    ***now you need to sort your data by Name *************; 

    proc sort data=original; 
    by Name; 
    run; 

********************************************************; 

    data u_want; 

    set original; 

    array Test[4]; 

    do i=1 to dim(Test); 

    if Test[i] >= 0 then Score=Test[i]; output; 

    end; 

    Drop i Test1-Test4; 

    run; 

    **********************************************************; 

    proc print data=u_want; 

    run; 

Thanks!