SAS PROC SQL 按所有变量分组以检测重复项
SAS PROC SQL Group by all variables to detect duplicates
我有一个包含 250 个变量的数据集。我认为有些行可能是完全重复的。如果我只有 3 个变量,我可以 运行 这段代码来检查欺骗:
proc sql;
create table checkDupe as
select count(*) as N, *
from bigTable
group by 1, 2, 3
having N > 1;
quit;
但是,有 250 个变量,我不想输入 group by 1, 2, 3, ... , 250
。
以下 group by
语句不起作用:
group by *
group by _ALL_
group by 1:250
是否有一种简洁的方法可以按所有变量进行分组?
尝试为数据集的列名生成宏变量,然后分组在sql;
proc sql;
select name into: name separate ',' from dictionary.columns where libname='SASHELP' and memname='CLASS';
quit;
proc sql;
select count(*) as N,* from sashelp.class group by &name;
quit;
如果只是想知道数据集中是否有完整的重复项,试试这个:
proc sort data=sashelp.class out=want nodup;
by _all_;
run;
如果所需的输出是 SAS 数据集中的每一行,则不需要分组。在 PROC SQL
中执行此操作的最简单方法是使用 distinct
关键字。
例如:
data one;
input a b c d;
datalines;
1 1 1 1
1 1 1 1
1 2 1 1
1 2 3 4
1 2 1 1
;
run;
proc sql;
select distinct * from one;
run;
...产生以下输出,其中消除了两个重复行。
检查重复项的示例代码return是一个数据集,其中包含键不唯一的所有记录。所以下面 returns 四个记录:
data bigtable;
input a b c d;
datalines;
1 1 1 1
1 1 1 1
1 2 1 1
1 2 2 1
1 2 2 2
;
run;
proc sql;
create table checkDupe1 as
select *,count(*) as N
from bigTable
group by 1, 2, 3
having N > 1;
quit;
假设您不需要 N
列,他们在 SAS 中获取所有非唯一行的数据集的最简单方法是使用 PROC SORT
和 NOUNIQUEKEY
选项.所以下面将 return 相同的四个记录:
proc sort data=bigtable out=checkDupe2 nouniquekey ;
by a b c ;
run ;
并且BY
语句可以是BY _ALL_
,这将return所有变量上重复的两条记录:
proc sort data=bigtable out=checkDupe3 nouniquekey ;
by _all_ ;
run ;
我有一个包含 250 个变量的数据集。我认为有些行可能是完全重复的。如果我只有 3 个变量,我可以 运行 这段代码来检查欺骗:
proc sql;
create table checkDupe as
select count(*) as N, *
from bigTable
group by 1, 2, 3
having N > 1;
quit;
但是,有 250 个变量,我不想输入 group by 1, 2, 3, ... , 250
。
以下 group by
语句不起作用:
group by *
group by _ALL_
group by 1:250
是否有一种简洁的方法可以按所有变量进行分组?
尝试为数据集的列名生成宏变量,然后分组在sql;
proc sql;
select name into: name separate ',' from dictionary.columns where libname='SASHELP' and memname='CLASS';
quit;
proc sql;
select count(*) as N,* from sashelp.class group by &name;
quit;
如果只是想知道数据集中是否有完整的重复项,试试这个:
proc sort data=sashelp.class out=want nodup;
by _all_;
run;
如果所需的输出是 SAS 数据集中的每一行,则不需要分组。在 PROC SQL
中执行此操作的最简单方法是使用 distinct
关键字。
例如:
data one;
input a b c d;
datalines;
1 1 1 1
1 1 1 1
1 2 1 1
1 2 3 4
1 2 1 1
;
run;
proc sql;
select distinct * from one;
run;
...产生以下输出,其中消除了两个重复行。
检查重复项的示例代码return是一个数据集,其中包含键不唯一的所有记录。所以下面 returns 四个记录:
data bigtable;
input a b c d;
datalines;
1 1 1 1
1 1 1 1
1 2 1 1
1 2 2 1
1 2 2 2
;
run;
proc sql;
create table checkDupe1 as
select *,count(*) as N
from bigTable
group by 1, 2, 3
having N > 1;
quit;
假设您不需要 N
列,他们在 SAS 中获取所有非唯一行的数据集的最简单方法是使用 PROC SORT
和 NOUNIQUEKEY
选项.所以下面将 return 相同的四个记录:
proc sort data=bigtable out=checkDupe2 nouniquekey ;
by a b c ;
run ;
并且BY
语句可以是BY _ALL_
,这将return所有变量上重复的两条记录:
proc sort data=bigtable out=checkDupe3 nouniquekey ;
by _all_ ;
run ;