我有一个名为'input'的数据集,其中包含以下观察结果
ID工资
10 1000
2000年2月
30 3000
40 4000
我需要一个带有以下观察结果的输出数据集
ID工资Next_row_Salary
10 1000 2000
20 2000 3000
30 3000 4000
40 4000 null
注意:场景是下一个obersavtion的薪水应该是Next_Row_salary列的当前观察值。 如果没有下一个观察值,则Next_Row_salary列的当前观察值应为“null”。
请帮我为这个场景创建一个sas代码。
答案 0 :(得分:18)
有几种方法可以达到这个目的,我就是这样做的。
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;
答案 1 :(得分:1)
在数据步骤中没有直接的方法可以做到这一点。您可以使用两种方法:
选项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;
答案 2 :(得分:1)
此代码来自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 ;