我试图找出如何创建一个运行总计,如果我们只有.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,但我无法让它适合我的情况。任何建议都非常欢迎!
答案 0 :(得分:3)
/* First calculate the sales per year */ proc sql ; create table meansales as select region_id, store_id, sum(sales) / count(year) as YEARLY_SALES from sales_data group by region_id, store_id order by region_id, store_id ; quit ; /* Merge back into original data */ data yearcalc ; merge sales_data meansales ; by region_id store_id ; if first.store_id then n = 0 ; n + 1 ; NEW_SALES = n * YEARLY_SALES ; drop n ; run ;
答案 1 :(得分: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年某种程度上缺失),这种情况仍然有效,因为销售价值是根据“时间跨度”而不是“计数”来填补的。