【问题标题】:How to use group by with proc means如何通过 proc 方法使用 group by
【发布时间】:2019-11-17 01:23:18
【问题描述】:

我想知道如何使用 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、YEAR 和 COST(或任何适合您测量的名称)。然后它可以工作任意年。
  • 谢谢汤姆。这是一个要分析的数据集样本,只是为了更好地解释这些步骤。我的困难在于按变量分组以获得每个时间段的平均值。现在我有多个日期用于单个帐户(id)。我正在使用滞后计算当前值与前一个值之间的差异

标签: sas


【解决方案1】:

您不想使用class id。该过程将计算每个id 组的平均值,因此每个id 只有一行。

您显示var amt,但显示的数据集有一个每年的金额列。你有专栏amt2015amt2016amt2017吗?

您需要使用正确的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,我有多个日期,即一年中的月份。对于每个月,我可以关联一个金额。这意味着我也需要按时间分组(我认为)。应使用 proc sql 中的 lag1 和 lag2 计算平均差。我希望这会有所帮助。如果您需要任何进一步的信息,请告诉我
  • 原始数据是否有列iddate(对应一个月)和amount?如果是这样,您是否想要平均年度总额和年度增量?如果您描述实际情况而不是某种中间状态,您的问题可能会更好。
  • 数据集有账户,每个账户关联的日期从 1 到 140 以月为单位。对每个蛾子计算一个数量。我想确定全年的平均余额金额(从 1 到 12,从 12 到 24...),而不是帐户。我希望这可以帮助
【解决方案2】:

你真的有你第一次显示格式的数据吗?如果是这样,变量的名称是什么? 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 来查找每个时间段的平均金额。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    相关资源
    最近更新 更多