Создание вычисляемых переменных в одном шаге данных - PullRequest
0 голосов
/ 21 июня 2019

Любая помощь очень ценится. Спасибо

Я хотел бы создать пару переменных с моими транзакционными данными

Я пытаюсь создать переменные 'act_bal' и 'штраф', используя количество, тип и Op_Bal. У меня есть следующие правила:

  1. Для первой записи идентификатор будет иметь op_bal и будет вычитается из «количества» для type = C и добавляется, если type = D для рассчитать act_bal
  2. Для второй записи далее это act_bal + сумма для type = C и act_bal-сумма для типа = D
  3. Я добавлю штраф 10, только если сумма> 4 и тип = D. У идентификатора может быть только два штрафа.
  4. Общий штраф должен быть вычтен из act_bal последнего запись, которая станет op_bal на следующий день. (например, для идентификатора 101, -178-20 = -198 станет op_bal для 2/4/2019)

Это данные, которые у меня есть для двух идентификаторов клиентов 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 голосов
/ 21 июня 2019

Несколько советов:

  • У вас есть один и тот же код для увеличения act_bal в блоках if и else, поэтому выделите его. Не повторяйся.
  • Вы можете пропустить оператор сохранения, если используете оператор суммы.
  • Используйте отдельную переменную, чтобы отслеживать количество штрафов, сработавших за день, но примените только первые два из них.

Итак, сложив все вместе:

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;
...