2017-03-22 3 views
0

私は、次のデータセットがあります。データセットをネットにする方法は?

data have; 
format id1 id2 $25. value 8.; 
input id1 id2 value; 
datalines; 
a b 10 
a c 2 
a d 6 
b a 5 
c a 3 
c d 7 
; 
run; 

を、私は、次のいずれかを取得したいと思います:

実際に
data want; 
format id1 id2 $25. value 8.; 
input id1 id2 value; 
datalines; 
a b 5 
a d 6 
c a 1 
c d 7 
; 
run; 

私は を持っている - 、最初の2行にわたる非命じたカップルに見えました - 値がより大きくなるようにカップルを保ち、 - それに値の差を割り当てました。

観測の順序は関係ありませんが、IDの順序は基本的です(たとえば、最終データセットの観測値(ca1)は(ca1)ではなく(ca -1)) 。 簡単にするために、私は文字を使用しましたが、IDは任意の文字列(25ドル)にすることができます。

ご協力いただければ幸いです。

多くの感謝!

答えて

0

アルファベット順にid1をソートし、スワップする場合はvaluevalue*-1に設定してください。次に、並べ替えby id1 id2。次にid1/id2の組み合わせごとに1を得るために必要に応じて行を合計します。その後、必要に応じてスワップバックします。

data have; 
format id1 id2 $25. value 8.; 
input id1 id2 value; 
datalines; 
a b 10 
a c 2 
a d 6 
b a 5 
c a 3 
c d 7 
; 
run; 

data reversed; 
    set have; 
    if id1 < id2 then do; 
    value = value * -1; 
    _id1 = id1; 
    id1 = id2; 
    id2 = _id1; 
    end; 
    drop _:; 
run; 

proc sort data=reversed; 
    by id1 id2; 
run; 

data want; 
    set reversed; 
    by id1 id2; 
    if first.id2 then _value=0; 
    _value + value; 
    if last.id2 then do; 
    value = _value; 
    if value < 0 then do; 
     _id1 = id1; 
     id1 = id2; 
     id2 = _id1; 
     value = value * -1; 
    end; 
    output; 
    end; 
    drop _:; 
run; 
関連する問題