Select 许多列和其他非连续列找到重复项?

Select many columns and other non-continuous columns to find duplicate?

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

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是重复的,因为指标不同,但它们本质上是同一条记录。要查找重复项,我想 select 不同的 ID、名称,然后是 C1 到 C90 进行检查,因为一些具有相同 ID 和指示符的声明具有不同的 C1...C90 值。

有没有办法通过 proc sql 或 sas 数据步骤 select c1...c90?看来我唯一能想到的方法就是设置数据集然后删除非必要的列,但在实际数据集中,它不仅是Indicator而且至少还有15个其他列。

如果我正确理解问题,最简单的方法是将列连接成一个。逐行保留该值,您可以跨行比较它是否相同。

data want;
  set have;
  by id indicator;
  retain last_cols;
  length last_cols 0;
  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 创建两个新变量,_type__freq_。如果你指定 _freq_ > 1 你将只输出重复的记录。另请注意,这将删除 Indicator 变量。

如果 PROC SQL 像其他 Procs 那样使用 : 变量名通配符就好了。当没有其他选择是合理的时,我通常使用宏来 select 批量列。这可能对你有用:

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