Sas 基于先前计算的行计算行值
我有一个SAS数据集,其总体结构类似于下面的数据集。我想根据每个ID(学生)上个月的钱和花费计算钱列中的所有“缺失”值 我的数据如下所示(输入数据): 我希望它看起来像这样(输出数据): 如何使用SAS实现这一点?我使用滞后函数尝试了类似的方法:Sas 基于先前计算的行计算行值,sas,datastep,Sas,Datastep,我有一个SAS数据集,其总体结构类似于下面的数据集。我想根据每个ID(学生)上个月的钱和花费计算钱列中的所有“缺失”值 我的数据如下所示(输入数据): 我希望它看起来像这样(输出数据): 如何使用SAS实现这一点?我使用滞后函数尝试了类似的方法: DATA OUTPUT_DATA; SET INPUT_DATA; IF MONTH > 1 THEN MONEY = LAG1(MONEY) - LAG1(SPEND); RUN; 但不幸的是,它没有返回预期的输出。可以使用以
DATA OUTPUT_DATA;
SET INPUT_DATA;
IF MONTH > 1 THEN MONEY = LAG1(MONEY) - LAG1(SPEND);
RUN;
但不幸的是,它没有返回预期的输出。可以使用以下方法创建数据:
data INPUT_DATA;
infile datalines;
input ID MONTH MONEY SPEND;
datalines;
01 1 1000 300
01 2 . 200
01 3 . 200
01 4 . 300
02 1 2000 100
02 2 . 100
02 3 . 150
02 4 . 100
03 1 900 600
03 2 . 100
03 3 . 200
;
run;
如果您创建一个保留的新变量,可能会更容易
data have;
input ID $ MONTH MONEY SPEND ;
cards;
01 1 1000 300
01 2 . 200
01 3 . 200
01 4 . 300
02 1 2000 100
02 2 . 100
02 3 . 150
02 4 . 100
03 1 900 600
03 2 . 100
03 3 . 200
;
data want;
set have ;
by id;
new_money = coalesce(money,new_money);
output;
new_money + -spend;
run;
结果:
new_
Obs ID MONTH MONEY SPEND money
1 01 1 1000 300 1000
2 01 2 . 200 700
3 01 3 . 200 500
4 01 4 . 300 300
5 02 1 2000 100 2000
6 02 2 . 100 1900
7 02 3 . 150 1800
8 02 4 . 100 1650
9 03 1 900 600 900
10 03 2 . 100 300
11 03 3 . 200 200
如果要删除原始变量并重新使用其名称,请添加DROP和RENAME语句
drop money;
rename new_money=money;
如果您创建一个保留的新变量,可能会更容易
data have;
input ID $ MONTH MONEY SPEND ;
cards;
01 1 1000 300
01 2 . 200
01 3 . 200
01 4 . 300
02 1 2000 100
02 2 . 100
02 3 . 150
02 4 . 100
03 1 900 600
03 2 . 100
03 3 . 200
;
data want;
set have ;
by id;
new_money = coalesce(money,new_money);
output;
new_money + -spend;
run;
结果:
new_
Obs ID MONTH MONEY SPEND money
1 01 1 1000 300 1000
2 01 2 . 200 700
3 01 3 . 200 500
4 01 4 . 300 300
5 02 1 2000 100 2000
6 02 2 . 100 1900
7 02 3 . 150 1800
8 02 4 . 100 1650
9 03 1 900 600 900
10 03 2 . 100 300
11 03 3 . 200 200
如果要删除原始变量并重新使用其名称,请添加DROP和RENAME语句
drop money;
rename new_money=money;