Экстраполировать итоговую сумму из.LAST значения BY GROUP

Я пытаюсь выяснить, как создать промежуточную сумму, если все, что у нас есть, это общая сумма в переменной.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, а затем поделить его на количество лет, для которых у нас есть данные, для помещения его в поле SORE на STORE_ID.FIRST? Как только я выясню, как получить значение из последнего поля в первое, я планирую просто запустить обычную промежуточную сумму (после деления на число, которое может быть создано чем-то вроде:

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, но не смог заставить его работать в моем случае. Любые предложения приветствуются!

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 год почему-то отсутствует), потому что стоимость продаж заполняется на основе "отношения временного интервала" вместо "подсчета".

/* Сначала рассчитать объем продаж за год * /
proc sql;
  создать таблицы как
  выберите region_id, store_id, сумму (продажи) / количество (год) как YEARLY_SALES
  из sales_data
  группировать по region_id, store_id 
  упорядочить по region_id, store_id;
уволиться;

/* Слить обратно в исходные данные * /
данные yearcalc;
  объединить sales_data
        средние продажи;
  by region_id store_id;
  если first.store_id, то n = 0;
  n + 1;
  NEW_SALES = n * YEARLY_SALES;

  брось n;
бежать;
Другие вопросы по тегам