2017-03-10 28 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变量。