2016-07-08 4 views
0

мои данные выглядят так, и я не могу понять, как получить столбец «хочу». К сожалению, я пробовал различные комбинации функций сохранения, запаздывания и суммирования.сумма по строкам разделена между двумя столбцами

month quantity1 quantity2 want 
1  a   x   x+sum(b to l) 
2  b   y   sum(x to y)+sum(c to l) 
3  c   z   sum(x to z)+sum(d to l) 
4  d  
5  e  
6  f  
7  g  
8  h  
9  i  
10  j  
11  k  
12  l  

Спасибо за любую помощь по этому вопросу

ответ

2

Удобно суммировать величину1, а затем сохранять значение в макропеременной. Использование избыточного "примера данных:

proc sql; 
    select sum(qty1) into:sum_qty1 from temp; 
quit; 

data want; 
    set temp; 
    value1+qty1; 
    value2+qty2; 
    want=value2+&sum_qty1-value1; 
    if missing(qty2) then want=.; 
    drop value:; 
run; 
1

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

data temp; 
    input month qty1 qty2; 
    datalines; 
     1 1 100 
     2 1 100 
     3 1 100 
     4 1 . 
     5 1 . 
     6 1 . 
     7 1 . 
     8 1 . 
     9 1 . 
     10 1 . 
     11 1 . 
     12 1 . 
    ; 
run; 

proc sql; 
    create table qty1_sums as select distinct 
     a.*, sum(b.qty1) as qty1_sums 
     from temp as a 
     left join temp as b 
     on a.month < b.month 
     group by a.month; 

    create table want as select distinct 
     a.*, 
     case when not missing(a.qty2) then sum(a.qty1_sums, sum(b.qty2)) end as want 
     from qty1_sums as a 
     left join temp as b 
     on a.month >= b.month 
     group by a.month; 
quit; 
1

Похож «каталки 12 месяцев суммой». Если это так, гораздо проще сделать с другой структурой данных (а не с двумя переменными, но с 24 строками 1 переменной); то у вас есть все инструменты ETS или простой процесс на этапе SQL или SAS.

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

data have; 
    do month = 1 to 12; 
    q_2014 = rand('Uniform')*10+500+month*5; 
    q_2015 = rand('Uniform')*10+550+month*5; 
    output; 
    end; 
run; 

data want; 
    array q2014[12] _temporary_;  *temporary array to hold data; 
    array q2015[12] _temporary_; 
    if _n_=1 then do;     *load data into temporary arrays; 
    do _n = 1 to n_data; 
     set have point=_n nobs=n_data; 
     q2014[_n] = q_2014; 
     q2015[_n] = q_2015; 
    end; 
    end; 
    set have; 
    do _i = 1 to _n_;       *grab the this_year data; 
    q_rolling12 = sum(q_rolling12,q2015[_i]); 
    end; 
    do _j = _n_+1 to n_data; 
    q_rolling12 = sum(q_rolling12,q2014[_j]);*grab the last_year data; 
    end; 
run;