谢谢你,京剧。
如下面数据所示,我的数据是这样的:先按日期,再按种类排序。例如,总共废品种类有ABCDE,想加等于1,但由于E是好品的代码,我删除了,只保留ABCD,所以每天的废品想加不等于1。另外,日期是不连续的,因为有些天没有生产(9-OCT~12-OCT)。还有,废品也不一定都有ABCD,原因是某些天投料少,废品只有ABCD中的1种至3种(12-OCT)。
- Date Category Per
- 9-Oct A 0.085
- 9-Oct B 0.005
- 9-Oct C 0.097
- 9-Oct D 0.053
- 12-Oct A 0.077
- 12-Oct B 0.044
- 12-Oct C 0.078
- 15-Oct A 0.045
- 15-Oct B 0.038
- 15-Oct C 0.055
- 15-Oct D 0.011
复制代码
按照上面数据,我最原始的思路是初始化所有行的lower=0,upper=Per,然后,再逐行判断,如果该行天数等于上一行,则lower=lag(upper),upper=lag(upper)+Per。如下面程序所示:
但由于lag函数的特殊性,这种办法未能成功。
- data have1;
- set have
- lower=0;
- upper=amount;
- if date = lag(date) then do;
- lower=lag(upper);
- upper=lag(upper)+amount;
- end;
- run;
复制代码
于是我就想按照你的思路:创建1个数组初始化所有天数的第一个废品的lower=0,upper=lower+amount,接着将该upper的数值用于重置数组,使相同天第二个废品的lower等于第一个废品的upper。。。如此循环。
- data have1;
- set have;
- array t[5] _temporary_(5*0);
- lower =t[date];
- upper =lower +amount;
- t[date] =upper;
- run;
复制代码因此,我需要增加一列将日期转换为按顺序排列的自然数,这就是我需要date1转化为date2的原因。date2这一列用在t[date]这里,因为t[X]的X只能是整数。
date date2
09OCT 1
09OCT 1
09OCT 1
10OCT 2
10OCT 2
11OCT 3
16OCT 4
16OCT 4
17OCT 5