我有一个大型数据集,并且想要为每个月的最接近月份最后一天的所有行过滤它。因此,最接近月份最后一天的那一天可能有多个条目。
所以例如: 原始数据集
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进行研究。
答案 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 ;
按时间间隔调整日期。在上述情况下,使用的四个参数是:
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