在一个数据步骤中创建计算变量

时间:2019-06-21 02:05:17

标签: loops sas lag calculation datastep

非常感谢您的帮助。谢谢

我想用我的交易数据创建几个变量

我正在尝试使用数量,类型和Op_Bal创建变量'act_bal'和'penalty'。我的规则是:

  1. 对于第一条记录,该ID将具有op_bal,它将是 从类型= C的“金额”中减去,如果类型= D,则添加到 计算act_bal
  2. 对于第二条记录,它是act_bal + type = C的金额,并且 type_D的act_bal-amount
  3. 仅当金额> 4并且type = D时,我才会加罚10。 该ID只能有两个处罚。
  4. 应从最后一个的act_bal中减去总罚款 记录,第二天将变为op_bal。 (例如,对于ID 101,-178-20 = -198将成为2019年4月2日的op_bal)

这是我为两个不同日期的两个客户ID 101和102所拥有的数据(我的实际数据集具有所有30天的数据)。

  id   date       amount    type  Op_Bal
  101  4/1/2019    50        C       100
  101  4/1/2019    25        D       
  101  4/1/2019    75        D       
  101  4/1/2019     3        D       
  101  4/1/2019    75        D       
  101  4/1/2019    75        D       
  101  4/2/2019   100        C
  101  4/2/2019   125        D
  101  4/2/2019   150        D
  102  4/1/2019    50        C       125
  102  4/1/2019   125        C       
  102  4/2/2019   250        D
  102  4/2/2019    10        D

我写的代码是这样的

  data want;
    set have;
    by id date;
   if first.id or first.date then do;
    if first.id then do;
    if type='C' then act_bal=Op_Bal - amount;
    if type='D' then act_bal=Op_Bal + amount;
   end;
  else do;
 retain act_bal;
   if type='C' then act_bal=act_bal + amount;
   if type='D' then act_bal=act_bal - amount;
    if amount>4 and type='D' then do;
    penalty=10;
    end;
 run;

我无法创建计数器来将罚款控制在2,也无法从最后一行的金额中减去总罚款金额。有人可以帮助我获得预期的结果吗?谢谢

  id   date       amount    type  Op_Bal  act_bal    penalty
  101  4/1/2019    50        C       200       150        0 
  101  4/1/2019    25        D                 125        0
  101  4/1/2019   150        D                 -25       10
  101  4/1/2019    75        D                 -100      10
  101  4/1/2019     3        D                 -103       0
  101  4/1/2019    75        D                 -178       0
  101  4/2/2019   100        C       -198       -98       0                    
  101  4/2/2019   125        D                 -223      10
  101  4/2/2019   150        D                 -373      10  
  102  4/1/2019    50        C       125        175       0
  102  4/1/2019   125        C                  300       0
  102  4/2/2019   250        D                   50       0
  102  4/2/2019    10        D                   40       0

1 个答案:

答案 0 :(得分:0)

一些提示:

  • 您在act_balif块中都有用于递增else的相同代码,因此将其分解。不要重复自己。
  • 如果使用sum语句,则可以跳过保留语句。
  • 使用一个单独的变量来跟踪每天触发的惩罚数量,但仅应用前两个惩罚。

因此,将它们放在一起:

data want;
  set have;
  by id date;
  if first.date and not first.id then op_bal = act_bal;
  if first.date then do;
    act_bal = op_bal;
    penalties = 0;
  end;
  if type='C' then act_bal + amount;
  if type='D' then act_bal + (-amount);
  if amount > 4 and type='D' then penalties + 1;
  if last.date then act_bal + (-min(penalties,2) * 10);
run;