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日
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个值的中位数不是总和的十二分之一,而是介于第六大值和第七大值之间的中间值吗?我希望你现在明白了,在提出问题时,你应该更加清楚