为另一列分配相同的值

问题描述

我在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作为变量名!