如何使用 proc summary 并保留所有变量(不命名)

How to use proc summary and keep all variables (without naming them)

我想对数据集中的特定变量求和,而不丢失所有其他列。我试过以下代码:

proc summary data=work.test nway missing; 
class var_1 var_2 ; *groups;
var salary; 
id _character_ _numeric_; * keeps all variables;
output out=test2(drop=_:) sum= ;
run;

但它似乎没有正确求和,对于 "salary" 列,我只剩下每个组中最后一个值的值(var_1 和 var_2 ).如果我删除

 id _character_ _numeric_; 

它工作正常,但我丢失了所有其他列。

示例:

数据:

data salary;
   input name $ dept $ Salary Sex $;
   datalines;
John Sales 23 M
John Sales 43 M
Mary Acctng 21 F
; 

期望输出:

约翰销售额 66 M

玛丽会计 21 F

试试这个:

data salary;
   input name $ dept $ Salary Sex $;
   datalines;
John Sales 23 M
John Sales 43 M
Mary Acctng 21 F
; 

proc sql;
    create table salary2 as
    select *, 
        monotonic() as n, 
        sum(salary) as sum_salary 
        from salary 
        group by name 
        having max(n)=n;
quit;

我不知道 SAS 这样做了,但问题似乎在于 id 语句优先于 var 语句。通过在 id 语句中包含所有变量,显示的所有输出都是每个变量的最大值,包括 Salary。

一个选项是从 dictionary.columns 中提取 classvar 语句中未包含的变量列表,然后在 id 语句中使用该列表.请注意 proc summary 在内存中运行,过去我遇到过内存不足的问题,当时 id 语句

中包含许多变量
data salary;
   input name $ dept $ Salary Sex $;
   datalines;
John Sales 23 M
John Sales 43 M
Mary Acctng 21 F
; 

proc sql noprint;
select name into :cols separated by ' '
from dictionary.columns
where   libname='WORK' 
        and 
        memname='SALARY'
        and
        name not in ('name','Salary');
quit;

%put &cols.;

proc summary data=salary nway missing;
class name;
var salary;
id &cols.;
output out=want (drop=_:) sum=;
run;

我认为这符合您的要求。您仍然会收到有关名称冲突和变量被删除的警告,但至少保留了您想要的。 ID 语句已贬值,有利于新的更好的 IDGROUP 输出语句选项。

如果您希望 PROC SUMMARY 自动重命名冲突变量,您可以将 AUTONAME 选项添加到输出语句。

data salary;
   input name $ dept $ Salary Sex $;
   datalines;
John Sales 23 M
John Sales 43 M
Mary Acctng 21 F
;;;;
   run; 
proc print;
   run;
proc summary nway missing; 
   class name dept; 
   var salary; 
   output out=test2(drop=_:) sum= idgroup(out(_all_)=);
   run;
proc print;
   run;