SAS:如何筛选最接近月末(每月)的(多个)条目

时间:2015-06-04 07:46:44

标签: loops date filter sas

我有一个大型数据集,并且想要为每个月的最接近月份最后一天的所有行过滤它。因此,最接近月份最后一天的那一天可能有多个条目。

所以例如: 原始数据集

date          price       name
05-01-1995    1,2         abc
06-01-1995    1,5         def
07-01-1995    1,8         ghi
07-01-1995    1,7         mmm
04-02-1995    1,9         jkl
27-02-1995    2,1         mno

目标:

date          price       name
07-01-1995    1,8         ghi
07-01-1995    1,7         mmm
27-02-1995    2,1         mno

我有两个想法,但我没有在SAS中循环(遍历几个月)中实现它。 1.idea:创建新列,指示当前月份的最后一天(intnx()函数);然后筛选最接近其当月最后一天的所有条目:

date          price       name   last_day_of_month
05-01-1995    1,2         abc    31-01-1995
06-01-1995    1,5         def    31-01-1995
07-01-1995    1,8         ghi    31-01-1995
04-02-1995    1,9         jkl    28-02-1995
27-02-1995    2,1         mno    28-02-1995

2.idea:只需过滤每月最高日期的条目(使用最大函数?!)

如果你能帮助我,我会很高兴,因为我已经习惯了普通的编程语言,并且刚开始使用SAS进行研究。

4 个答案:

答案 0 :(得分:1)

proc sql是解决此类情况的一种方法。我将解释您原来的要求,并解释如何在sql中解释它们。

由于您希望group观察日期,您可以使用having子句过滤每月的max日期。

data work.have;
input date DDMMYY10. price name $;
format date date9.;
datalines;
05-01-1995    1.2         abc
07-01-1995    1.8         ghi
06-01-1995    1.5         def
07-01-1995    1.7         mmm
04-02-1995    1.9         jkl
27-02-1995    2.1         mno
;

data work.want;
input date DDMMYY10. price name $;
format date date9.;
datalines;
07-01-1995    1.8         ghi
07-01-1995    1.7         mmm
27-02-1995    2.1         mno
;

proc sql ;
create table work.want as
  select *
    /*, max(date) as max_date format=date9.*/
    /*, intnx('month',date,0,'end') as monthend format=date9.*/
  from work.have
  group by intnx('month',date,0,'end')
  having max(date) = date
  order by date, name
;

如果取消注释注释,则使用的实际过滤器将显示在输出表中。

将要求与解决方案进行比较:

proc compare base=work.want compare=work.solution;

结果

  

注意:未找到不相等的值。所有比较的值都完全相同。

答案 1 :(得分:0)

1)创建一个新的变量periode = put(date,yymmn6。)/ *给你yyyymm * / 2)对periode和date进行排序 3)现在periode.last逻辑将选择每个periode所需的记录。

像...一样的东西。

A         |         B
------------------------
1         |        10,20
2         |        30,40

答案 2 :(得分:0)

您可以使用两个名为intnx的SAS功能来执行intck

proc sql

proc sql ; create table want as select *, put(date,yymmn6.) as month, intck('days',date,intnx('month',date,0,'end')) as DaysToEnd from have group by month having (DaysToEnd=min(DaysToEnd)) ;quit ; 按时间间隔调整日期。在上述情况下,使用的四个参数是:

  1. 大小'步骤'你想添加/减少间隔。
  2. 正在引用的日期
  3. 要制作多少个间隔步骤
  4. 如何围绕'步骤(例如将其舍入到结果日/周/年的开始/结束/中间)
  5. Intnx()只计算两个日期之间的间隔步数

    这将为您提供最接近月末的所有记录

答案 3 :(得分:0)

Another approach is by using proc rank;

data mid;
  retain yrmth date;
  set have;
  format date yymmddn8.;
  yrmth = put(date,yymmn6.);
run;

proc sort data = mid;
  by yrmth descending date;
run;

proc rank data = mid out = want descending  ties=low;
by yrmth;
var date;
ranks rankdt;
run;

data want1;
  set want;
  where rankdt = 1;
run;

HTH