2017-03-10 6 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와 인디케이터를 가진 일부 클레임이 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

굉장! 행운을 비세요! – Hugs

0

질문을 올바르게 이해하면 가장 쉬운 방법은 열을 하나로 연결하는 것입니다. RETAIN은 행마다 값을 비교하며, 행간에 비교하여 동일한지 여부를 확인할 수 있습니다.

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이 삭제됩니다.