问题描述
我在SAS有一项任务; 我需要做的是在Fake_1列中分配October的Current_value(60),并只在10月,11月和12月的几个月重复一次;应当对Fake_2列使用相同的逻辑,并为Fake_2列的11月和12月分配11月的Current_Value。 那就是我的桌子的样子:
Product_Code Division Category Payment_Frequency Selling_Type expiring_month Current_Value Fake_1 Fake2
C611720 17822 AZ Monthly NSD 1 63
C611720 17822 AZ Monthly NSD 2 72
C611720 17822 AZ Monthly NSD 3 23
C611720 17822 AZ Monthly NSD 4 24
C611720 17822 AZ Monthly NSD 5 90
C611720 17822 AZ Monthly NSD 6 87
C611720 17822 AZ Monthly NSD 7 56
C611720 17822 AZ Monthly NSD 8 43
C611720 17822 AZ Monthly NSD 9 57
C611720 17822 AZ Monthly NSD 10 60 60
C611720 17822 AZ Monthly NSD 11 48 60 48
C611720 17822 AZ Monthly NSD 12 32 60 48
该怎么办?我认为解决方案将使用保留功能,但是我在使用它时有点挣扎,因为sas在fake1列中为11月/ 12月的值显示了48和32的值。
data sox_8;
set sox_7;
retain Fake_1;
if Expiring_Month > 9 then Fake_1 = Current_Value;
run;
感谢您的支持
解决方法
> 9
表示它会更新10、11和12。您只想更新10,所以:
data sox_8;
set sox_7;
retain Fake_1;
if Expiring_Month = 10 then Fake_1 = Current_Value;
run;
现在,您可能想像这样扩展代码:
data sox_8;
set sox_7;
array Fake[*] Fake_1-Fake_2;
retain Fake_1-Fake_2;
if Expiring_Month gt 9 and Expiring_Month lt 12 then
Fake[Expiring_Month-9] = Current_Value;
run;
这将同时针对10和11进行更新。大概您最终将拥有可能在2021年要花两个月以上的时间的代码-这使您可以开始一个程序,该程序将自动选择它需要(您还需要根据运行的月份来计算Fake
尺寸,可能还需要一个宏变量)。
%let curmonth=10;
data sox_8;
set sox_7;
array Fake[*] Fake_1-Fake_%sysevalf(12-&curmonth);
retain Fake_:;
if Expiring_Month ge &curmonth and Expiring_Month lt 12 then
Fake[Expiring_Month - &curmonth + 1] = Current_Value;
run;
当然,请不要在实际代码中使用Fake
作为变量名!