如何使用proc摘要并保留所有变量(不指定它们)

时间:2016-07-01 09:47:06

标签: sas summary

我想在我的数据集中总结一个特定变量,而不会丢失所有其他列。我尝试了以下代码:

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;

但它似乎并不正确,而对于“薪水”栏,我只剩下每组中最后一个值的值(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
; 

所需的输出

John Sales 66 M

Mary Acctng 21 F

3 个答案:

答案 0 :(得分:5)

我认为这可以满足您的需求。您仍然会收到有关名称冲突和变量被删除的警告,但至少保留了您想要的变量。 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;                                                                                                                   

enter image description here

答案 1 :(得分:2)

试试这个:

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;

答案 2 :(得分:1)

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

一种选择是从class中提取vardictionary.columns语句中未包含的变量列表,然后在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;