我想知道如何使用SAS代码获得此结果。我有以下数据集:
id 2015 2016 2017
1 £10 £12 £11
2 £12 £14 £13
3 £11 £20 £10
4 £10 £13 £21
5 £15 £11 £18
并且我想按以下方式计算平均值:
id 2015 2016 2017
1 £10 £12 £11
2 £12 £14 £13
3 £11 £20 £10
4 £10 £13 £21
5 £15 £11 £18
Mean £11.6 £14 £14.6
我认为使用proc手段可以做到这一点:
proc means data=work.dataset1;
output out=work.dataout mean= /autoname;
var amt;
class id;
run;
现在,我需要按以下方式计算周期之间的平均差:
mean_diff_12= mean - mean2
mean_diff_23= mean2 - mean3
而且我想到了使用滞后:
mean2=lag1(mean)
mean3=lag2(mean)
其中mean
是从proc means
得到的平均值。但是,如上表所示,我很难按变量分组并获得均值。
您的帮助将不胜感激。谢谢
您不想使用class id
。该过程将计算每个id
组的平均值,因此每个id
只有一行。
您显示var amt
,但显示的数据集包含每年的金额列。您是否有amt2015
,amt2016
,amt2017
列?
您将需要使用Proc MEANS
的正确语法。示例:
data have; input
id amt2015-amt2017; datalines;
1 10 12 11
2 12 14 13
3 11 20 10
4 10 13 21
5 15 11 18
run;
proc means noprint data=have;
var amt2015-amt2017;
output out=means mean=amt2015-amt2017 / autoname;
run;
data means;
set means;
meandiff_1_2 = amt2015-amt2016;
meandiff_2_3 = amt2016-amt2017;
run;
proc print data=means; run;
-------- listing --------
meandiff_ meandiff_
Obs _TYPE_ _FREQ_ amt2015 amt2016 amt2017 1_2 2_3
1 0 5 11.6 14 14.6 -2.4 -0.6
您真的拥有您最初显示的格式的数据吗?如果是这样,变量的名称是什么? 2016
不是有效的变量名称。
假设您拥有更规范化形式的数据(或可以将其转换为此类数据。)>
data have ; input id $ @; do year=2015 to 2017 ; input amt @ ; output; end; cards; 1 10 12 11 2 12 14 13 3 11 20 10 4 10 13 21 5 15 11 18 ;
然后您可以使用PROC MEANS查找每个时间段的平均amt。
proc summary data=have nway ; class year; var amt ; output out=means mean=mean_amt ; run;
以及一个简单的数据步骤来计算时间段之间的差:
data want; set means; mean_dif = dif(mean_amt); run;
结果:
Obs year _TYPE_ _FREQ_ mean_amt mean_dif
1 2015 1 5 11.6 .
2 2016 1 5 14.0 2.4
3 2017 1 5 14.6 0.6