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;
我有一个包含许多列的数据集,如下所示:
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;