2017-03-10 78 views
0

我有這樣的包含多列數據集:選擇許多列和其他非連續列以查找重複?

ID Indicator Name C1 C2 C3....C90 
A 0001 Black 0 1 1.....0 
B 0001 Blue 1 0 0.....1 
B 0002 Blue 1 0 0.....1 

有些ID的是重複的,因爲該指標是不同的,但他們本質上是相同的記錄。爲了找到重複的內容,我想選擇不同的ID,Name,然後選擇C1到C90來檢查,因爲具有相同Id和指標的一些索賠具有不同的C1 ... C90值。

有沒有辦法通過proc sql或sas數據步驟選擇c1 ... c90?似乎我能想到的唯一方法是設置數據集,然後刪除非必要列,但在實際數據集中,它不僅是指標,而且還包含至少15個其他列。

回答

1

這將是很好,如果PROC SQL使用:變量名通配符像其他Procs做。當沒有其他選擇是合理的,我通常使用宏來選擇批量列。這可能適合你:

%macro sel_C(n); 
    %do i=1 %to %eval(&n.-1); 
     C&i., 
    %end; 
    C&n. 
%mend sel_C; 
proc sql; 
    select ID, 
      Indicator, 
      Name, 
      %sel_C(90) 
    from have_data; 
quit; 
+0

我從來不知道你可以選擇使用宏的批量列,這是非常有益的! – PinkyL

+0

太棒了!祝你好運PinkyL! – Hugs

0

如果我正確理解問題,最簡單的方法是將列連接到一個。保留行到行的值,並且可以跨行比較它,看看它是否相同。

data want; 
    set have; 
    by id indicator; 
    retain last_cols; 
    length last_cols $500; 
    cols = catx('|',of c1-c90); 
    if first.id then call missing(last_cols); 
    else do; 
    identical = (cols = last_cols); *or whatever check you need to perform; 
    end; 
    output; 
    last_cols = cols; 
run; 
0

有幾種不同的方法可以做到這一點,它會容易得多,如果實際的列名是C1 - C90。如果你只是想刪除任何你知道重複的東西,你可以使用proc sort

proc sort data=dups out=nodups nodupkey; 
by ID Name C1-C90; 
run; 

的nodupkey選項將自動在by語句中刪除任何重複。

或者,如果您想知道哪些記錄包含重複記錄,可以使用proc summary

proc summary data=dups nway missing; 
class ID Name C1-C90; 
output out=onlydups(where=(_freq_ > 1)); 
run; 

proc summary創建兩個新的變量,_type__freq_。如果您指定_freq_ > 1,則只會輸出重複記錄。另外請注意,這將刪除Indicator變量。