2016-12-14 6 views
1

У меня есть данные, которые выглядят как это в SAS;Суммирование нескольких столбцов по дате в SAS

Date Type_1 Type_2 
4/8/2015 21654.72 . 
4/9/2015 34490.13 . 
4/9/2015 32429  . 
4/9/2015 .  24438.76 
4/9/2015 .  54043.18 
4/9/2015 .  58969.06 
4/9/2015 .  57721.01 
4/9/2015 .  46313.08 
4/10/2015 .  49974.06 
4/10/2015 .  52403.41 
4/10/2015 25260.07 . 
4/10/2015 27891.98 . 
4/11/2015 .  28130.06 
4/11/2015 24886.15 . 
4/11/2015 10407.6 . 
4/11/2015 49422.71 . 
4/11/2015 15242.28 . 
4/11/2015 .  25295.52 
4/11/2015 .  17522.67 
4/13/2015 29798.99 . 
4/13/2015 10445.17 . 
4/13/2015 23678.87 . 
4/13/2015 .  35470.87 
4/13/2015 .  33941.01 
4/13/2015 .  30206.06 
4/13/2015 .  26591.98 

Я пытаюсь использовать шаг данных SAS подытожить TYPE_1 и type_2 и консолидировать обе колонки по дате.

Я пробовал такой код:

data work.data; 
    set data_consolidated; 
    by date; 

    if first.date then total_type_1=0 and total_type_2=0; 
    total_type_1 + type_1; 
    total_type_2 + type_2; 
    if last.date then output; 
    drop type_1; 
    drop_type_2; 
run; 

Этот код consilidates дату, но вместо суммирования всех значений, которые находятся в столбцах для даты, она добавляет текущее значение для всех предыдущих значений в совокупности.

Просто чтобы быть ясно, ниже является примером того, что я пытаюсь получить данные выглядеть следующим образом:

date  type_1  type_2 
4/8/2015 21654.72 . 
4/9/2015 66919.13 128472.85 
4/10/2015 53152.05 102377.47 
4/11/2015 99958.74 70948.25 

Любые советы или помощь очень ценится.

ответ

2

Попробуйте это:

proc sql; 
    select distinct date, sum(type_1) as type_1, sum(type_2) as type_2 from data_consolidated group by date; 
quit; 
+0

Это прекрасно работает. Наверное, я решил, что на этапе данных и не заглянул в proc sql. Спасибо @shenglin chen! – Jarom

1

Я думаю, ваша проблема эта линия.

if first.date then total_type_1=0 and total_type_2=0; 

Это приведет к настройке total_type_1 либо 1 (истина) или 0 (ложь), на основе оценки логического выражения на правой стороне оператора присваивания. Значение total_type_2 не изменяется.

Возможно, вы имели в виду сделать:

if first.date then total_type_1=0; 
if first.date then total_type_2=0; 

или

if first.date then do; 
    total_type_1=0; 
    total_type_2=0; 
end; 

Использование цикла DOW является хорошим способом, чтобы сделать этот тип вещи в шаге данных.

data want; 
    do until(last.date); 
    set data_consolidated; 
    by date; 
    total_type_1 = sum(total_type_1,type_1,0); 
    total_type_2 = sum(total_type_2,type_2,0); 
    end; 
    drop type_1 type_2 ; 
run; 
+0

Это похоже на проблему. Сейчас это очевидно, но я не понимал, что линия должна быть разбита на две, чтобы выполнить правильно. – Jarom