我想知道如何使用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;
现在,我需要计算周期之间的差异。我在按变量分组和获得上表中的平均值方面遇到了困难。
我们将非常感谢你的帮助。感谢
您不希望使用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平均值来查找每个时间段的平均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