Sas 基于字符变量计算数值

Sas 基于字符变量计算数值,sas,Sas,我有以下数据集 Date Company Sales Jan05 Coca-Cola 256 Jan05 Lowes 70 Jan05 Apple 90 Feb05 McDonald 456 Feb05 Apple 89 Feb05 Microsoft 876 March05 April05 . . . Jan06

我有以下数据集

Date       Company      Sales
Jan05     Coca-Cola      256    
Jan05     Lowes          70
Jan05     Apple          90    
Feb05     McDonald       456
Feb05     Apple          89
Feb05     Microsoft      876
March05
April05
. 
.
.
Jan06     Apple          678
Jan06     Lowes          87
Jan06     Intel          56 
Feb06     McDonald       67
Feb06     Apple          281
Feb06     Barclays       876
March06
April06
.
.
.
Jan07    Apple          567
Jan07    Lowes          76
Jan07    Intel          87
Feb07    TJmax          678
Feb07    McDonald       765
Feb07    Astraz         67
March07   
April06
.
.
.
May15
如您所见,该数据集从2005年1月开始,一直持续到2015年5月。一年中每个月都有数百家公司拥有不同的销售额

我正试图计算每一家至少连续13个月(即从开始到结束的12个月)进行购买的公司的12个月销售增长率。 如果有12个月的多个周期,我想要中等的

举几个例子:

  • 如果一家公司只在2005年1月2005年2月2日购买,…直到。。。2006年1月,增长率为
    (2006年1月销售额=2005年1月销售额)/2005年1月销售额
  • 如果一家公司在12个月的多个不相交期间购买,比如2005年1月,…直到。。。2006年1月和2008年1月,…直到。。。2009年1月和2010年1月……直到。。。2011年1月,增长率为个人增长率的中位数
  • 如果一家公司只在连续14个月内购买,比如2005年1月,…直到。。。2006年2月增长率是2005年1月的中位数,…到。。。2006年1月和2005年2月,…直到。。。2006年2月2日

使用信息读取数据: -在SAS中,唯一的数据类型是固定宽度字符串和双精度数字。 -看起来像日期变量的实际上是一个数字(即自1960年1月1日以来的天数),带有相关的打印格式。我使用了
ddmmyy9
。 -要从字符串表示中读入日期,可以使用informat。我用了
monyy5.

data theInput;
    infile theFile firstobs=2;
    format Date ddmmyy9. Company $12. Sales 8.;
    input Date monyy5. Company $ Sales;
;
run;
排序

proc sort data=theInput out=reOrdered;
    by Company Date;
run;
data individualRates;
    set reOrdered;
    by Company Date;
    format From Till monyy7.;

    from = lag12(Date);
    oldSales = lag12(Sales);

    if lag12(Company) EQ Company 
    and INTCK('month', from, Date) EQ 12 then do;
        till = Date;
        rate =  (Sales - oldSales) / oldSales;
        output;
    end;
run;
proc means data=individualRates noprint;
    by Company;
    output out=medianRates median(rate)=medianRate;
run;
获取个人增长率

proc sort data=theInput out=reOrdered;
    by Company Date;
run;
data individualRates;
    set reOrdered;
    by Company Date;
    format From Till monyy7.;

    from = lag12(Date);
    oldSales = lag12(Sales);

    if lag12(Company) EQ Company 
    and INTCK('month', from, Date) EQ 12 then do;
        till = Date;
        rate =  (Sales - oldSales) / oldSales;
        output;
    end;
run;
proc means data=individualRates noprint;
    by Company;
    output out=medianRates median(rate)=medianRate;
run;
计算中间值

proc sort data=theInput out=reOrdered;
    by Company Date;
run;
data individualRates;
    set reOrdered;
    by Company Date;
    format From Till monyy7.;

    from = lag12(Date);
    oldSales = lag12(Sales);

    if lag12(Company) EQ Company 
    and INTCK('month', from, Date) EQ 12 then do;
        till = Date;
        rate =  (Sales - oldSales) / oldSales;
        output;
    end;
run;
proc means data=individualRates noprint;
    by Company;
    output out=medianRates median(rate)=medianRate;
run;

可能需要以下信息来澄清您的要求:1.同一公司的每个“销售”数据之间的时间段是否总是12个月的倍数?2.“日期”变量的格式是什么?@user2916331。我想计算一个12个月的增长率,所以它必须是相隔12个月的公司。从05年1月到06年1月,06年1月到07年1月到08年1月,其他月份也是如此。2:我的日期格式是数字格式。12个月的增长率是连续12年每月的算术平均增长率吗?(即超过11个差异)和另一个问题:我应该将增长视为差异还是百分比?我所说的12个月增长率是指12个月的中值增长率。对不起,我只会在确定您想要什么时继续编程,所以让我提出几个具体问题。你知道中间值和平均值不一样吗?如果你有2010年1月到2010年12月的数据,你是否因为你只有11个增长率而取消了该案例的资格?如果您有2010年1月至2011年2月的数据,您是否希望将2010年1月至2011年1月的中值增长率和2010年2月至2011年2月的中等增长率放在单独的输出行上?我的数据是从2005年1月到2015年5月。我想计算2005年1月至2006年1月、2005年2月至2006年2月、2005年3月至2006年3月的中位数,依此类推。这样,每一行都有一个一年中每个月的增长率中位数。你知道12个值的中位数不是总和的十二分之一,而是介于第六大值和第七大值之间的中间值吗?我希望你现在明白了,在提出问题时,你应该更加清楚