【问题标题】:How to sum value from next row by group using SAS?如何使用SAS按组对下一行的值求和?
【发布时间】:2016-03-08 18:13:35
【问题描述】:

我想在我的数据集中创建一个列,用于计算另一个字段的当前行和下一行的总和。数据中有几个组,如果下一行是当前组的一部分,我只想取下一行的总和。如果一行是该组的最后一条记录,我想用空值填充。

我正在引用reading next observation's value in current observation,但仍然无法弄清楚如何获得我需要的解决方案。

例如:

data have;
   input Group ID Salary;
   cards;
10 1 1
10 2 2
10 3 2
10 4 1
11 1 2
11 2 2
11 3 1
11 4 1

;
run;

我想在这里得到的结果是这样的:

data want;
   input Group ID Salary Sum;
   cards;
10 1 1 3
10 2 2 4
10 3 2 3
10 4 1 .
11 1 2 4
11 2 2 3
11 3 1 2
11 4 1 .

;
run;

【问题讨论】:

    标签: sas


    【解决方案1】:

    与 Tom 的回答类似,但使用“前瞻”合并(没有 by 语句和 firstobs=2):

    数据要; 合并有 有 (firstobs=2 保持=团体工资 rename=(Group=NextGroup Salary=NextSalary)) ; 如果 Group = NextGroup 那么 sum = sum(Salary,NextSalary) ; 下一个:; 跑 ;

    【讨论】:

      【解决方案2】:

      使用 BY 组处理和跳过第一个观察的第二个 SET 语句。

      data want ;
        set have end=eof;
        by group ;
        if not eof then set have (keep=Salary rename=(Salary=Sum) firstobs=2);
        if last.group then Sum=.;
        else sum=sum(sum,salary);
      run;
      

      【讨论】:

        【解决方案3】:

        我找到了一个使用 proc expand 的解决方案,它产生了我需要的东西:

        proc sort data = have;
            by Group ID;
        run;
        
        proc expand data=have out=want method=none;
         by Group;
         convert Salary = Next_Sal / transformout=(lead 1);
        run;
        
        data want(keep=Group ID Salary Sum);
            set want;
            Sum = Salary + Next_Sal;
        run;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-29
          • 2019-02-17
          • 2018-10-17
          • 2019-09-17
          相关资源
          最近更新 更多