如何使用 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
中提取 class
或 var
语句中未包含的变量列表,然后在 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;
我想对数据集中的特定变量求和,而不丢失所有其他列。我试过以下代码:
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
中提取 class
或 var
语句中未包含的变量列表,然后在 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;