2017-01-22 7 views
0

У меня есть сложный вопрос об условной сумме в SAS. На самом деле, это очень сложно для меня, и поэтому я не могу объяснить это словами. Поэтому я хочу показать пример:Как сохранить вычисленные значения между строками при вычислении текущих итогов?

A  B 
5  3 
7  2 
8  6 
6  4 
9  5 
8  2 
3  1 
4  3 

Как вы можете видеть, у меня есть техническое описание, состоящее из двух столбцов. Прежде всего, я вычислил условную накопленную сумму столбца А (я могу сделать это самим, так не нужна помощь для этого шага): не

A  B CA 
5  3 5 
7  2 12 
8  6 18  
6  4 8  ((12+8)-18)+6 
9  5 17 
8  2 18 
3  1 10 (((17+8)-18)+3 
4  3 14  

Таким образом, мое состояние значение 18. Если накопленных более чем 18 , то оно равно 18 и следующее значение, если сумма первого значения после 18 и превышает сумму более 18. (Как я уже сказал, я могу сделать это сам) Так что сложной частью является вычисление суммарной суммы столбца B в соответствии с к колонке А:

A  B CA CB 
5  3 5  3 
7  2 12 5 
8  6 18 9.5 (5+(6*((18-12)/8))) 
6  4 8  5.5 ((5+6)-9.5)+4 
9  5 17 10.5 (5.5+5) 
8  2 18 10.75 (10.5+(2*((18-7)/8))) 
3  1 10 2.75 ((10.5+2)-10.75)+1 
4  3 14 5.75 (2.75+3) 

Как видно из примера, совокупная сумма столбца В является очень конкретной. Когда столбец CA равен нашему значению условия (18), мы вычисляем долю последнего значения для получения нашего значения условия (18), а затем используем эту пропорцию для вычисления суммарной суммы столбца B.

ответ

3

Похож, когда сумма A достигает 18 или более, вы хотите разбить значения A и B между текущей и следующей записью. Один из способов - запомнить оставшиеся значения для A и B и переносить их вперед в ваших новых кумулятивных переменных. Просто убедитесь, что вы вывели наблюдение перед сбросом этих переменных.

data want ; 
    set have ; 
    ca+a; 
    cb+b; 
    if ca >= 18 then do; 
    extra_a=ca - 18; 
    extra_b=b - b*((a - extra_a)/a) ; 
    ca=18; 
    cb=cb-extra_b ; 
    end; 
    output; 
    if ca=18 then do; 
    ca=extra_a; 
    cb=extra_b; 
    end; 
    drop extra_a extra_b ; 
run; 
+0

Большое спасибо. Большой :) – Khalid

 Смежные вопросы

  • Нет связанных вопросов^_^