Sas 如何通过proc方式使用group by

Sas 如何通过proc方式使用group by,sas,Sas,我想知道如何使用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

我想知道如何使用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;
现在,我需要计算周期之间的差异。 我在按变量分组和获得上表中的平均值方面遇到困难


非常感谢你的帮助。谢谢

您不想使用
类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

您不想使用
类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不是有效的变量名

假设您拥有更规范化的数据形式(或者可以将其转换为这种形式)

然后,您可以使用PROC MEANS查找每个时间段的平均金额

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

你真的有第一次显示的格式的数据吗?如果是,变量的名称是什么<代码>2016不是有效的变量名

假设您拥有更规范化的数据形式(或者可以将其转换为这种形式)

然后,您可以使用PROC MEANS查找每个时间段的平均金额

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

谢谢你,理查德。对于每个id,我有多个日期,即一年中的月份。对于每个月,我可以关联一个金额。这意味着我也需要按时间分组(我想)。应在proc sql中使用lag1和lag2计算平均差。我希望这能有所帮助。如果您需要任何进一步的信息,请告诉我原始数据是否有列
id
date
(对应于一个月)和
amount
?如果是这样,您是否想要平均年度金额总额和同比增量?如果您描述实际情况而不是中间状态,您的问题可能会更好。数据集有帐户,每个帐户的关联日期为1到140个月。每只蛾子的数量是计算出来的。我想确定全年的平均余额金额(从1到12,从12到24…),而不是账户。我希望这能帮上忙谢谢你Richard。对于每个id,我有多个日期,即一年中的月份。对于每个月,我可以关联一个金额。这意味着我也需要按时间分组(我想)。应在proc sql中使用lag1和lag2计算平均差。我希望这能有所帮助。如果您需要任何进一步的信息,请告诉我原始数据是否有列
id
date
(对应于一个月)和
amount
?如果是这样,您是否想要平均年度金额总额和同比增量?如果您描述实际情况而不是中间状态,您的问题可能会更好。数据集有帐户,每个帐户的关联日期为1到140个月。每只蛾子的数量是计算出来的。我想确定全年的平均余额金额(从1到12,从12到24…),而不是账户。我希望这能帮助你了解第一张图片中的数据是怎样的?通常不能将数字用作变量名。将数据存储为每年每个id的单独观察可能更灵活。因此,您的数据集只有三个变量ID、年份和成本(或者您正在测量的任何名称)。那么它可以工作很多年。谢谢汤姆。这是一个要分析的数据集样本,只是为了更好地解释这些步骤。我的困难在于按变量分组,以获得每个时间段的平均值。现在我有多个单一帐户(id)的日期。我用拉格朗日法计算当前值和前一个值之间的差值,第一张图是不是真的有数据?通常不能将数字用作变量名。将数据存储为每年每个id的单独观察可能更灵活。因此,您的数据集只有三个变量ID、年份和成本(或者您正在测量的任何名称)。那么它可以工作很多年。谢谢汤姆。这是一个要分析的数据集样本,只是为了更好地解释这些步骤。我的困难在于按变量分组,以获得每个时间段的平均值。现在我有多个单一帐户(id)的日期。我用滞后法计算当前值和前一个值之间的差值