将 SAS MACRO 扩展到多个字段
Extend SAS MACRO to multiple fields
我有一个受 "PROC SQL by Example" 启发的宏,它根据单个 column/field 查找重复行:
data have ;
input name $ term $;
cards;
Joe 2000
Joe 2000
Joe 2002
Joe 2008
Sally 2001
Sally 2003
; run;
%MACRO DUPS(LIB, TABLE, GROUPBY) ;
PROC SQL ;
CREATE TABLE DUPROWS AS
SELECT &GROUPBY, COUNT(*) AS Duplicate_Rows
FROM &LIB..&TABLE
GROUP BY &GROUPBY
HAVING COUNT(*) > 1
ORDER BY Duplicate_Rows;
QUIT;
%MEND DUPS ;
%DUPS(WORK,have,name) ;
proc print data=duprows ; run;
我想扩展它以查找基于多列的重复项(在我的示例中为第 1 行和第 2 行),但仍然足够灵活以处理单个列。
在这种情况下,它将 运行 代码:
proc sql ;
create table duprows as select name,term,count(*) as Duplicate_Rows
from work.have
group by name,term
HAVING COUNT(*) > 1
;quit;
生产:
要包含任意数量的字段以进行分组,您可以在 groupby
宏参数中列出所有字段,但列表必须以逗号分隔并由 %quote()
包围。否则 SAS 会看到逗号并认为您提供了更多宏参数。
因此在您的情况下,您的宏调用将是:
%dups(lib = work, table = have, groupby = %quote(name, term));
由于 &groupby
包含在 select
和 group by
子句中,所有列出的字段都将出现在输出中并将用于分组。这是因为当 &groupby
解析时,它变成文本 name, term
.
我有一个受 "PROC SQL by Example" 启发的宏,它根据单个 column/field 查找重复行:
data have ;
input name $ term $;
cards;
Joe 2000
Joe 2000
Joe 2002
Joe 2008
Sally 2001
Sally 2003
; run;
%MACRO DUPS(LIB, TABLE, GROUPBY) ;
PROC SQL ;
CREATE TABLE DUPROWS AS
SELECT &GROUPBY, COUNT(*) AS Duplicate_Rows
FROM &LIB..&TABLE
GROUP BY &GROUPBY
HAVING COUNT(*) > 1
ORDER BY Duplicate_Rows;
QUIT;
%MEND DUPS ;
%DUPS(WORK,have,name) ;
proc print data=duprows ; run;
我想扩展它以查找基于多列的重复项(在我的示例中为第 1 行和第 2 行),但仍然足够灵活以处理单个列。
在这种情况下,它将 运行 代码:
proc sql ;
create table duprows as select name,term,count(*) as Duplicate_Rows
from work.have
group by name,term
HAVING COUNT(*) > 1
;quit;
生产:
要包含任意数量的字段以进行分组,您可以在 groupby
宏参数中列出所有字段,但列表必须以逗号分隔并由 %quote()
包围。否则 SAS 会看到逗号并认为您提供了更多宏参数。
因此在您的情况下,您的宏调用将是:
%dups(lib = work, table = have, groupby = %quote(name, term));
由于 &groupby
包含在 select
和 group by
子句中,所有列出的字段都将出现在输出中并将用于分组。这是因为当 &groupby
解析时,它变成文本 name, term
.