По групповой обработке в САС - PullRequest
2 голосов
/ 26 января 2012

У меня очень большая таблица с индексированным полем даты и времени.Я хочу выполнить групповую обработку набора данных по месяцам и выводить только последнее наблюдение за каждый месяц.

Проблема в том, что в нем нет поля месяца, поэтому я не могу использовать что-то вроде этого:

if last.month then do;
  output;
end;

Есть ли способ, с помощью которого я могу добиться такого поведения, не добавляя поле месяца в предыдущем шаге данных?Таблица сжата на 50 гигов, поэтому я хочу избежать ненужных шагов.

Спасибо

Ответы [ 2 ]

7 голосов
/ 26 января 2012

На самом деле вы можете достичь этого, используя 'by groupformat' для вашего исходного набора данных, отформатировав поле datetime как 'dtmonyy5.' Как следует из названия, эта группа группируется по форматированным значениям вместо оригинальных.

data new1;
set old;
format datetime dtmonyy5.;
by groupformat datetime;
if last.datetime;
run;

Другим методом является использование Proc Summary, хотя это может занимать много памяти, особенно при работе с большими наборами данных. Вот код.

proc summary data=old nway;
class datetime;
format datetime dtmonyy5.;
output out=new2 (drop=_:) maxid(datetime(_all_))=;
run;

Просто быстрое примечание к предыдущему ответу, функция 'month' работает с полями даты, а не с datetime, поэтому вам нужно добавить функцию datepart в строку.

month = month(datepart(datetime));
4 голосов
/ 26 января 2012

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

data new / view=new;
 set old;
 month = month(datepart(datetime));
run;

Если вы запустите это, вы увидите, что время обработки меньше секунды, поэтому вы знаете, что он не генерирует новый набор данных объемом 50 ГБ. Но вы можете просто использовать представление данных new со своим кодом, как если бы это был набор данных.

...