2013-06-28 76 views
1

的數據看起來像兩套:如何對比的變量(在SAS)

ID----X1----X2----X3----Z1----Z2----Z3

對於每個ID,可以考慮兩組變量{X1, X2, X3}{Z1, Z2, Z3}是:

  • 數字的X和Z可能相等或不相等。他們也可能有缺失的值。
  • 每組中變量的值是唯一的。也就是說,對於每個ID,X1不等於X2不等於X3。這同樣適用於Zs。
  • Xs和Zs的值可以相等,這就產生了問題。如何創建保留X和Z相等值並排除不等值的新數據。例如,如果X 1是等於任何ZS,然後X1將連同Z.

保留考慮一個假想的數據:

data temp; 

input ID x1 x2 x3 z1 z2 z3; 

datalines; 

1001  11  12  13  .  12  11 

1002  21  22  23 24  25  26 

1003  31  32  33 31  32  . 

1004  41  42  43 41  44  45 
; 

run; 

我希望它是:

1001  11  12  .  .  12  11 

1002  .  .  .  .  .  . 

1003  31  32  . 31  32  . 

1004  41  .  . 41  .  . 

回答

3

如果我理解正確,您需要分別處理每個陣列。首先,將X的值設置爲不在Z中的缺失值,然後返回並設置Z中不在X中的值。試試這個:

data want; 
    set temp; 
    array Xarr{*} x:; 
    array Zarr{*} z:; 

    do _i_=1 to dim(Xarr); 
     if not (Xarr(_i_) in Zarr) 
     then Xarr(_i_) = .; 
     end; 

    do _i_=1 to dim(Zarr); 
     if not (Zarr(_i_) in Xarr) 
     then Zarr(_i_) = .; 
     end; 
    drop _i_; 
run; 
1

不相鄰的斯堪的納維亞航空公司的權利,但這個應該大致你是什麼後:

data test; 
    set temp; 

    array arrx{*} x:; 
    array arrz{*} z:; 

    arriter = max(dim(arrx), dim(arrz)); 

    do _i = 1 to arriter; 
    if arrx{_i} ne arrz{_i} then do; 
     arrx{_i} = .; 
     arrz{_i} = .; 
    end; 
    end; 
run; 

我不確定你想要做什麼的情況下,有更多的元素在X比在Z或反之亦然,所以這段代碼將保持原樣。

+0

編輯因錯字...... – undershock

+0

我喜歡陣列的解決方案,但要求每個x的問題相比,任何的Z- - 你的代碼只有每個x比作相應的2。 –