Sas 首先使用分组处理。最后

Sas 首先使用分组处理。最后,sas,Sas,我刚开始学习sas,希望得到一些帮助来理解下面的代码块。以下程序按部门计算年度工资 proc sort data = company.usa out=work.temp; by dept; run; data company.budget(keep=dept payroll); set work.temp; by dept; if wagecat ='S' then yearly = wagrate *12; else if wagecat = 'H

我刚开始学习sas,希望得到一些帮助来理解下面的代码块。以下程序按部门计算年度工资

proc sort data = company.usa out=work.temp;
   by dept;
   run;
data company.budget(keep=dept payroll);
    set  work.temp;
    by dept;
    if wagecat ='S' then yearly = wagrate *12;
    else if wagecat = 'H' then yearly = wagerate *2000;
    if first.dept then payroll=0;
    payroll+yearly;
    if last.dept;

    run;
问题:

  • out=work.temp在代码的第一行中做什么
  • 我理解数据步骤为每个by变量(first.varible/last.variable)创建了2个临时变量,值为1或0,但是first.dept和last.dept在代码中到底做了什么
  • 为什么从第二行到最后一行的first.dept后面需要payroll=0

  • 此代码获取工资数据,并计算每个部门一年的工资总额,假设所有12个月的工资相同,且小时工工作2000小时

  • 它创建数据集的副本,该副本被排序并存储在工作库中。RTM
  • OUT=SAS数据集 命名输出数据集。如果SAS数据集不存在,则PROC SORT将创建它。 注意事项: 使用PROC SORT WITH OUT=时要小心。 在没有OUT=选项的情况下,当过程无错误地执行时,PROC SORT将用排序后的观察值替换原始数据集。 默认值不带OUT=,PROC SORT覆盖原始数据集。 提示:在数据库排序中,输出数据集不能引用DBMS上的输入表。 您可以在OUT=的情况下使用数据集选项。 请参见SAS数据集选项:参考 按多个变量的值排序的示例

  • First.DEPT是一个指标变量,用于指示特定分组的首次观察结果。因此,当您遇到某个部门的第一条记录时,它会被识别。Last.DEPT是该特定部门的最后一条记录。这意味着下一条记录将是另一个部门的第一条记录

  • 它在每条记录的第一条将PAYROLL设置为0。因为你有
    if last.dept
    这意味着只输出每个部门的最后一条记录。这段代码不是直观的-它是一种手动方式来计算每个部门员工的工资总额。常用的方法是使用摘要过程,例如MEANS/summary,但我假设他们试图避免两次传递数据。不过,如果你不排序,它也可能同样快

  • 。SAS文档对这些初学者主题非常全面

    这里有一种替代方法,可以产生完全相同的结果,但在我看来更直观

    data temp;
      set company.usa;
      if wagecat='S' then factor=12; *salary in months;
      else if wagecat='H' then factor=2000; *salary in hours;
    run;
    
    proc means data=temp noprint NWAY;
    class dept;
    var wagerate;
    weight factor;
    output out=company.budget sum(wagerate)=payroll;
    run;
    

    运行数据步骤,但将last.dept和first.dept存储到特定变量中,以便查看其运行方式。我还会添加显式输出或PUT语句来查看处理过程,如果您有冒险精神,也可以使用调试工具。最好避免在堆栈溢出问题上同时问多个问题。前两个问题可以通过阅读SAS文档来回答。第三个问题是一个更好的问题——正如Reeza在下面解释的那样,这是一个总结。