【问题标题】:sas Proc expand proceduresas Proc 扩展过程
【发布时间】:2015-10-07 23:17:31
【问题描述】:

我正在尝试按国家/地区按产品计算以下数据的 3 个月移动平均值(我这里只有两个国家变量)。有办法吗?

这是我的销售表:

Date    Product  Country   Sales
201101  Sofa     US        100
201102  Sofa     US        200
201103  Sofa     US        250
201104  Sofa     US        300
201101  Sofa     CA        250
201102  Sofa     CA        300
201103  Sofa     CA        250
201104  Sofa     CA        300
201101  Chair    US        300
201102  Chair    US        300
201103  Chair    US        300
201104  Chair    US        300
201101  Chair    CA        300
201102  Chair    CA        300
201103  Chair    CA        300
201104  Chair    CA        300

我尝试了类似以下的方法,但移动平均线仅按国家/地区计算。有没有办法按国家、按产品计算?任何想法将不胜感激。谢谢:)

PROC SORT DATA=Sales;
BY Country Product Date;
RUN;

PROC EXPAND DATA=Sales out =ma;
By Country Product;
CONVERT Value=Value_ma/transformin=(setmiss 0) transformout=(movave 3);
run;

【问题讨论】:

  • 我不确定 3 个月的平均值,因为您的表提供了 4 个月,我不知道这里应该如何计算 3 个月的平均值,但您可以使用 proc sql 和 avg 和 group by按产品和国家/地区获得所有月份的总平均值,然后以某种方式将其扩展到 3 个月,或者可能使用 proc 方法构建一些东西,但我想你在这里想要其他东西?
  • 感谢 Kl78。我正在绘制一条趋势线,以按国家/地区显示按产品划分的 3 个月移动平均销售额。所以第 1 个月和第 2 个月没有移动平均值。第 3 个月移动平均值基于前 3 个月。然后第 4 个月的移动平均值基于第 2、第 3 和第 4 个月。等等。
  • 嗯,好的。对proc expand了解不多,但是您可以通过组合产品和国家来制作一列,然后仅在新列上使用by,例如copr=catx("_",Product,country);,然后按copr分组,如果结果正常,则在显示数据时删除copr。

标签: sas expand proc


【解决方案1】:

在我的评论之后我测试了一下,我猜连接产品和国家会给出你正在寻找的结果(我希望我仍然没有理解错误):

data have;
input Date $ Product $ Country $ Sales ; 
datalines; 
201101  Sofa     US        100 
201102  Sofa     US        200 
201103  Sofa     US        250 
201104  Sofa     US        300 
201101  Sofa     CA        250 
201102  Sofa     CA        300 
201103  Sofa     CA        250 
201104  Sofa     CA        300 
201101  Chair    US        300 
201102  Chair    US        300 
201103  Chair    US        300 
201104  Chair    US        300 
201101  Chair    CA        300 
201102  Chair    CA        300 
201103  Chair    CA        300 
201104  Chair    CA        300 
; 
run;

data have ;
set have; 
copr=catx("_",Product,country); 
run; 
PROC SORT DATA=have; 
BY copr Date; 
RUN;

PROC EXPAND DATA=have out =ma  ; 
 By copr; 
CONVERT sales=average /    transformin=(setmiss 0) transformout=(movave 3); 
run;

proc print data=ma; 
 var date product country average; 
where time > 1; 
run;

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多