Sas 选择多个列和其他非连续列以查找重复的?

Sas 选择多个列和其他非连续列以查找重复的?,sas,proc-sql,datastep,Sas,Proc Sql,Datastep,我有一个包含许多列的数据集,如下所示: 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和指示符的声明具

我有一个包含许多列的数据集,如下所示:

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个其他列。

如果我正确理解了这个问题,最简单的方法是将列连接到一个。在行与行之间保留该值,您可以跨行比较该值,以查看其是否相同

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;

有几种不同的方法可以做到这一点,如果实际的列名是
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
创建两个新变量,
\u type
\u freq
。如果指定
\u freq\u>1
,则只输出重复记录。另外,请注意,这将删除
指示符
变量。

如果
PROC SQL
像其他程序一样使用
变量名通配符,那就太好了。当没有其他合理的选择时,我通常使用宏来选择批量列。这可能适合您:

%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;

我从来不知道可以使用宏选择大容量列,这非常有用!令人惊叹的!祝你好运,平凯尔!