7

我有一个名为“输入”的数据集,其中包含以下观察结果

ID 工资
10 1000
20 2000
30 3000
40 4000

我需要一个具有以下观察结果的输出数据集

ID 工资 Next_row_Salary
10 1000 2000
20 2000 3000
30 3000 4000
40 4000 null

注意:场景是下一个观察的薪水应该是列 Next_Row_salary 的当前观察值。如果没有下一个观察值,则 Next_Row_salary 列的当前观察值应为“null”。

请帮助我为这种情况创建一个 sas 代码。

4

3 回答 3

19

有几种方法可以实现这一点,这就是我的做法。

data have;
   input ID Salary;
   cards;
10 1000
20 2000
30 3000
40 4000
;
run;

data want;
   recno=_n_+1;
   set have end=last;
   if not last 
           then set have (keep=salary rename=(salary=next_row_salary)) point=recno;
      else call missing(next_row_salary);
run;
于 2012-07-20T13:20:07.533 回答
2

在数据步骤中没有直接的方法可以做到这一点。您可以使用两种方法:

选项1:反向排序,使用滞后功能

proc sort data=your_dataset;
 by descending id;
run;

data your_dataset;
 set your_dataset;
 next_row_salary = lag(salary);
run;

proc sort; by id; run;

选项 2:使用proc expand

proc expand data=your_dataset method=none;
 by id;
 convert salary = next_row_salary / transformout=(lead 1);
run;
于 2012-07-20T13:16:49.057 回答
2

此代码来自 SAS-L 上的 Paul Dorfman,它也可以通过一次数据传递来完成您正在寻找的事情

Data Salary;
input id salary;
Datalines;
10 1000
20 2000
30 3000
40 4000
;
Run;

data need ;
retain id salary;
set salary (rename=(id = origid salary=next_salary)) end=end ;
if _n_ > 1 then output;
salary = next_salary;
id = origid;
if not end then return;
call missing(next_salary);
output;
drop origid;
run ;
于 2012-08-03T04:23:15.217 回答