2017-03-22 21 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; 

在實踐中我已經 - 尋找非下令跨前兩行夫婦, - 保持這對夫婦的價值更大, - 併爲其分配值之間的差異。

觀察順序不相關,但ID的順序是基本的(例如,最終數據集中的觀察值(ca 1)不等於(ca 1),但是等於(ca -1)) 。 爲了簡單起見,我使用了字母,但ID可以是任何字符串(25美元)。

任何幫助將非常感激。

非常感謝!

回答

0

按字母順序排列id1/id2,如果涉及交換它們,請將value設置爲value*-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;