2012-01-06 136 views
0

這裏是我的數據集: Name Mark Math1 Math2 Math3 ----------------------------- --------輸出觀察是否符合標準

Justin AA1 1 0 1 
Justin BB1 1 1 1 
Justin BA1 0 1 0 
Justin  BC2 0  0  1 

這裏是SAS代碼來創建它

  DATA Student1; 
     INPUT Name $ Mark $ Math1 Math2 Math3; 
     DATALINES; 
     Justin AA1 1 0 1 
     Justin BB1 1 1 1 
     Justin BA1 0 1 0 
     Justin BC2 0 0 1 
     ; 

我想評價MATH1和輸出旁邊如果遇到1的關口,但是因爲Math1中使用了該位置,Math2中不能再使用該位置,即輸出Justin的Math1爲AA1,Math2的BB1輸出(因爲這是第一個位於的位置)列)和BC2,因爲即使我們在AA1和BB1的同一行上有1,這兩個標記已經在var Math1和Math2中使用過了。

這是輸出數據集應該是什麼樣子

 data Student2; 
     input name $ Math1 $ Math2 $ Math3 $; 
     datalines; 
     Justin AA1 BB1 BC2 
     ; 

我能做到這一點使用數組?

+0

這似乎是一個問題,涉及在輸出解決方案數據集之前操縱輸入數據集。如果您可以發佈更準確的輸入數據集視圖,可以找到解決方案。你能否在數據庫中包含數據步驟,以便可以測試解決方案? – 2012-01-06 13:35:12

+0

是否有從math1到math3的強制性命令?例如如果第二行是「Justin BB1 0 0 1」,那麼我們跳過這一行或輸出bb1並跳過第四行bc2,因爲已經使用了math3? – 2012-01-07 10:05:20

+0

這是正確的Robbie我們跳過了這一行,因爲1在這種情況下是一個指示符1在第三列中,所以我們在第四行輸出標記。這個標記必須是唯一的,即不能輸出兩次 - 這是困難的部分 – Makoto 2012-01-07 10:39:40

回答

0

在這種情況下,數組可能不夠用。以下是使用IML的解決方案(希望)(看起來很龐大)。我推測你可能需要處理一個以上的學生,所以要在多個名稱的情況下適用。請評論是否有任何錯誤。

DATA Student1; 
    INPUT Name $ Mark $ Math1 Math2 Math3; 
     DATALINES; 
     Justin AA1 1 0 1 
     Justin BB1 1 1 1 
     Justin BA1 0 1 0 
     Justin BC2 0 0 1 
     Wayne AB1 1 0 1 
     Wayne BC1 0 0 1 
     Wayne BD2 0 1 0 
     Wayne BE3 1 1 1 
     ; 
    quit; 

proc iml; 
    use student1; 
    read all var{name mark} into x; 
    read all var{math1 math2 math3} into y; 
z=j(nrow(y),ncol(y),'mon'); 
i=1; 
    do j=2 to nrow(x); 
    if x[j,1]^=x[j-1,1] | j=nrow(x) then do; 
     if j=nrow(x) then j=j+1; 
     do k=1 to 3; 
      do l=i to j-1; 
      if y[l,k]=1 then do; 
      y[l,k:3]=0; 
      y[l+1:j-1,k]=0; 
      z[i:j-1,k]=x[l,2]; 
      end; 
      end; 
     end; 
     i=j; 
    end; 
    end; 
    colname={'math1', 'math2', 'math3'}; 
create new from z[colname=colname]; 
append from z; 
quit; 

data new; 
merge student1(keep=name) new; 
run; 

proc sort data=new out=new nodupkey; 
by name; 
run; 
+0

感謝羅比 - 偉大的解決方案 - 我認爲它可能涉及IML - 我是否正在遊蕩是否有辦法繞過它 – Makoto 2012-01-08 02:57:11