【问题标题】:Select many columns and other non-continuous columns to find duplicate?选择许多列和其他非连续列以查找重复?
【发布时间】:2017-03-10 16:18:16
【问题描述】:
我有一个包含许多这样的列的数据集:
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 个其他列。
【问题讨论】:
标签:
sas
proc-sql
datastep
【解决方案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;
【解决方案2】:
如果我正确理解了这个问题,最简单的方法是将列连接到一个。逐行保留该值,您可以跨行比较它以查看它是否相同。
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;
【解决方案3】:
有几种不同的方法可以做到这一点,如果实际的列名是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 变量。