通过SAS中的组处理

时间:2012-01-25 20:00:29

标签: sas

我有一个非常大的表,其中包含一个索引日期时间字段。我希望按月对数据集进行分组处理,并且只输出每个月的最后一次观察。

问题是它不包含月份字段,所以我不能使用这样的东西:

if last.month then do;
  output;
end;

有没有办法可以实现这种行为而无需在之前的datastep中添加月份字段?该表是50 gig压缩,所以我想避免任何不必要的步骤。

由于

2 个答案:

答案 0 :(得分:7)

您可以使用'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;

只需快速记下上一个答案,'月'功能对日期字段起作用,而不是日期时间,因此您需要将datepart函数添加到该行。

month = month(datepart(datetime));

答案 1 :(得分:4)

使用数据视图这是一个很好的情况。这允许您添加在处理数据集时即时创建的变量,而无需创建新的物理数据集。

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

如果你运行它,你会发现处理时间不到一秒,所以你知道它没有生成一个新的50 GB数据集。但您可以将数据视图new与您的代码一起使用,就像它是一个数据集一样。