全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2357 9
2016-10-23
悬赏 100 个论坛币 已解决
daten
2011-03-01

36

2011-03-02

37

2011-03-03

38

2011-03-04

39

2011-03-07

40

2011-03-08

41


规则是:z的取值为x对应date的n的数值或者是x最接近的之前的那个时期n的取值。
比如宏变量x为2011-03-03,那么宏变量z的取值为38.
当x为2011-03-05或者2011-03-06时候,z取值为39
x我哦哦2011-0.-07时候,z为40



之前只取对应观测的时候我是这么做的
                proc sql noprint;
                select n into :z from aaa
                where date=&x;
                quit;



最佳答案

prince315 查看完整内容

data aaa; input date yymmdd10. n; format date yymmdd10.; cards; 2011-03-01 36 2011-03-02 37 2011-03-03 38 2011-03-04 39 2011-03-07 40 2011-03-08 41 ; run; %let x="03MAR2011"d; proc sql; select max(n) into :z from aaa where date
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2016-10-23 19:28:22
data aaa;
input date yymmdd10. n;
format date yymmdd10.;
cards;
2011-03-01 36
2011-03-02 37
2011-03-03 38
2011-03-04 39
2011-03-07 40
2011-03-08 41
;
run;

%let x="03MAR2011"d;
proc sql;
select max(n) into :z
from aaa
where date<=&x.
;
quit;

这里其实假定了数据中n是按照日期单调增的情况。楼上的解答只是没考虑到最近接且之前的后面这个“之前”条件而已,但也很有参考意义。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-10-24 10:53:09
data aaa;
input date yymmdd10. n;
format date yymmdd10.;
cards;
2011-03-01 36
2011-03-02 37
2011-03-03 38
2011-03-04 39
2011-03-07 40
2011-03-08 41
;
run;

%let x="03MAR2011"d;
proc sql;
select n into :z from aaa
having abs(date-&x.)=min(abs(date-&x.));
quit;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-10-24 13:29:11
prince315 发表于 2016-10-24 11:29
data aaa;
input date yymmdd10. n;
format date yymmdd10.;
我的x是这种形式的   %let x="2011-02-03";   ,其实是从类似这种宏变量1994-04-01*1994-07-28*1995-04-25*1995-08-05*1996-04-20中取出来的   怎么转换成能够在data数据集中被识别成日期的形式呢   ,而不是通过这样的%let x="03MAR2011"d才能被识别成日期
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-10-24 13:31:37
l1i2n3i4n5g 发表于 2016-10-24 10:53
data aaa;
input date yymmdd10. n;
format date yymmdd10.;
我的x是这种形式的   %let x="2011-02-03";   ,其实是从类似这种宏变量1994-04-01*1994-07-28*1995-04-25*1995-08-05*1996-04-20中取出来的   怎么转换成能够在data数据集中被识别成日期的形式呢   ,而不是通过这样的%let x="03MAR2011"d才能被识别成日期            顶顶顶顶顶顶顶顶顶顶顶顶
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-10-24 14:06:45
小鳄鱼a 发表于 2016-10-24 13:31
我的x是这种形式的   %let x="2011-02-03";   ,其实是从类似这种宏变量1994-04-01*1994-07-28*1995-04-2 ...
%let x="2011-03-03";
proc sql;
select n into :z from aaa
having abs(date-input(&x.,yymmdd10.))=min(abs(date-input(&x.,yymmdd10.)));
quit;
%put &z.;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群