1

如果我们所拥有的只是 .LAST 变量中的总和,我试图弄清楚如何创建一个运行总计。我创建了一个示例数据集,它应该让我更清楚我所追求的:

DATA SALES_DATA; 
    INPUT REGION_ID STORE_ID YEAR SALES; 
    DATALINES; 
        1   1   2000    .
        1   1   2001    .
        1   1   2002    .
        1   1   2003    40
        1   2   1977    .
        1   2   1978    .
        1   2   1979    .
        1   2   1980    .
        1   2   1981    12
        2   3   1999    .
        2   3   2000    .
        2   3   2001    .
        2   4   2002    17
        3   4   1956    .
        3   4   1957    22

;

因此,如您所见,我们只有商店最后一次营业的数据,其中包括前几年的所有销售额。假设销售额完全是线性的并且逐年增加,我将如何告诉 SAS 获取 STORE_ID.LAST 值,然后将其除以我们有数据的年数,以便将其放入 STORE_ID.FIRST 的 SALES 字段中?一旦我弄清楚如何从最后一个字段中获取值到第一个字段中,我计划只运行通常的运行总计(除以计数后,可以通过以下方式创建:

DATA SALES; 
    SET SALES; 
    BY REGION_ID STORE_ID; 
    IF FIRST.STORE = 1 THEN 
        COUNT =0;
        COUNT+1; 
run;

所以,理想情况下,决赛桌的开始是这样的:

DATA SALES_DATA; 
INPUT REGION_ID STORE_ID YEAR SALES; 
DATALINES; 
    1   1   2000    10
    1   1   2001    20
    1   1   2002    30
    1   1   2003    40

...

我查看了 PROC EXPAND,但我无法让它适用于我的情况。非常欢迎任何建议!

4

2 回答 2

3
/* 首先计算每年的销售额 */
过程 sql ;
  创建表meansales为
  选择 region_id, store_id, sum(sales) / count(year) 作为 YEARLY_SALES
  来自销售数据
  按 region_id、store_id 分组
  按 region_id、store_id 排序;
辞职 ;

/* 合并回原始数据 */
数据年计算;
  合并 sales_data
        平均销售额;
  按 region_id store_id ;
  如果 first.store_id 然后 n = 0 ;
  n + 1 ;
  NEW_SALES = n * YEARLY_SALES ;

  放下 n ;
跑 ;
于 2014-02-03T09:15:05.287 回答
2

只是对 Chris J 的代码进行了一点改进,只是在 proc sql 中进行了外推。不要忘记给他充分的信任:)

proc sql;
    create table filled(rename=(sales_filled=sales)) as
    select REGION_ID, STORE_ID, YEAR, max(SALES)/(max(YEAR)-min(YEAR)+1)*(YEAR-min(YEAR)+1) as sales_filled
    from sales_data
    group by REGION_ID, STORE_ID
    order by REGION_ID, STORE_ID, Year;
quit;

注意:即使年份不连续(例如,2001 年不知何故丢失),这也有效,因为销售价值是根据“时间跨度比率”而不是“计数”填充的。

于 2014-02-03T09:58:12.157 回答