【问题标题】:how to use SAS array for counting and averaging by group?如何使用 SAS 数组进行分组计数和平均?
【发布时间】:2014-09-23 03:49:52
【问题描述】:

我有以下数据集:

客户 ID NGIF RAMN RFA1

2001 6 52 1
2002 1 23 1
2003 8 99 1
2004 20 100 4
2005 11 114 3
2006 9 138 1
2007 7 105 3
2008 15 190 2
2009 27 297 1
2010 22 207 1
2011 19 171 2

我想使用数组计算每个 RFA1 级别(即 1-4)的平均值(RFA1 级别的总 RAMN/该 RFA1 级别的总数)。如果没有数组,如果我拆分并执行,我会得到单个级别的结果。以下是代码:

enter code here

data averagetotalcatlog (drop=CustomerID NGIF RAMN);
set Catlog;
    by RFA1;
where RFA1 = 1;
if First.RFA1 then TotalRAMN = 0 & TotalCust = 0 & Average = 0;
TotalCust + 1;
TotalRAMN + RAMN;
if Last.RFA1;
Average = TotalRAMN / TotalCust;
run;

我的问题是如何使用数组为 RFA1 的所有 4 个级别编写此代码??

【问题讨论】:

  • 你觉得那些&在做什么?可能不是他们实际在做什么。
  • 进一步,为什么要对数组执行此操作? PROC MEANS 很乐意为您完成这项工作。
  • 感谢乔的回复。我已经用 PROC MEANS 试过了,是的,他们正在做需要做的事情。但是我正在学习 SAS 并且对它更新鲜,并且也想学习数组。因此,我正在尝试使用数组来解决它。我认为使用 '&' 我会根据 if 条件在一句话中初始化三个变量。请原谅我的无知,让我知道我哪里出错了。
  • & 不能那样工作。我建议学习 SAS 入门课程来学习如何做这样的事情;在你学习基本的东西之前,你已经跳得太远了。
  • @Joe:感谢您对 & 的建议,它帮助我找到了解决方案。

标签: sas


【解决方案1】:

SAS 使用数组来处理“宽格式”的数据

如果您使用 proc transpose 转置数据,则可以使用数组来操作数据。

data temp;
input CustID NGIF RAMN RFA1;
datalines;
2001 6 52 1
2002 1 23 1
2003 8 99 1
2004 20 100 4
2005 11 114 3
2006 9 138 1
2007 7 105 3
2008 15 190 2
2009 27 297 1
2010 22 207 1
2011 19 171 2
;
run;

proc sort data=temp; by RFA1; run;

proc transpose data=temp out=temp2;
by RFA1;
var RAMN;
run;

data temp3;
    set temp2;
        SUM_RAMN = 0; CNT_RAMN = 0;
        array COL_{6} COL1-COL6;
        do I = 1 to 6;
            if COL_{I} ne . then do;
                SUM_RAMN = SUM_RAMN + COL_{I};
                CNT_RAMN = CNT_RAMN + 1;
            end;
        end;
        AVG_RAMN = SUM_RAMN/CNT_RAMN;
    keep RFA1 AVG_RAMN;
run;

但是,正如之前所指出的...对于可以在 SAS 中使用比数组更简单的方法解决的问题,这将是一个非常困难的解决方案。

【讨论】:

  • 您好 JJFord3,感谢您的回答。是的,很难使用数组 n 得到这个结果。我也制定了一个代码。 proc排序数据=目录;通过 RFA1;跑; data averagetotalcatlog (drop=CustomerID NGIF RAMN LASG LASD RFA2 Money Order);设置目录;通过 RFA1;数组 RFA1_ar (3) TotalCust TotalRAMN 平均值;如果 First.RFA1 那么 TotalCust = 0; TotalCust + 1;如果 First.RFA1 则 TotalRAMN = 0;总RAMN + RAMN;如果最后一个.RFA1;平均值 = TotalRAMN / TotalCust;放下我;跑;我不知道它是否有效地使用了数组,但它对我有用。
猜你喜欢
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
相关资源
最近更新 更多