我想在我的数据集中总结一个特定变量,而不会丢失所有其他列。我尝试了以下代码:
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
答案 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;
答案 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
中提取var
或dictionary.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;