楼主: 小鳄鱼a
2407 9

宏变量的对应取值问题 [推广有奖]

  • 6关注
  • 10粉丝

已卖:280份资源

学科带头人

3%

还不是VIP/贵宾

-

威望
0
论坛币
125 个
通用积分
0.0040
学术水平
40 点
热心指数
45 点
信用等级
43 点
经验
32801 点
帖子
1185
精华
0
在线时间
1539 小时
注册时间
2009-7-16
最后登录
2018-10-5

楼主
小鳄鱼a 发表于 2016-10-23 19:28:21 |AI写论文
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
关键词:proc sql Select Elect Where print

沙发
prince315 在职认证  发表于 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是按照日期单调增的情况。楼上的解答只是没考虑到最近接且之前的后面这个“之前”条件而已,但也很有参考意义。
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

总评分: 论坛币 + 5  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

藤椅
l1i2n3i4n5g 在职认证  发表于 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;
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

总评分: 论坛币 + 5  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

板凳
小鳄鱼a 发表于 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才能被识别成日期

报纸
小鳄鱼a 发表于 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才能被识别成日期            顶顶顶顶顶顶顶顶顶顶顶顶

地板
l1i2n3i4n5g 在职认证  发表于 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.;
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

总评分: 论坛币 + 5  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

7
prince315 在职认证  发表于 2016-10-24 15:58:35
data aaa;
input date yymmdd10. n;
format date date9.;
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;

proc sql;
select date into :dt_list separated by ' '
from aaa
;
quit;
%put &dt_list.;

在具体提取单个日期并转成实际可识别的日期类型时,可参考:
%let i = 1;
%let dt =%bquote(")%scan(&dt_list.,&i.,' ')%bquote("D);

%put &dt.;
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

总评分: 论坛币 + 5  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

8
小鳄鱼a 发表于 2016-10-24 16:52:53
l1i2n3i4n5g 发表于 2016-10-24 10:53
data aaa;
input date yymmdd10. n;
format date yymmdd10.;
我找到我的问题症结所在了 , 请看看附件 ,  谢谢。也就是b为什么不能显示宏变量 dti的取值


9
小鳄鱼a 发表于 2016-10-24 16:54:21
prince315 发表于 2016-10-24 15:58
data aaa;
input date yymmdd10. n;
format date date9.;
请看看我刚传的附件   谢谢

10
l1i2n3i4n5g 在职认证  发表于 2016-10-24 23:50:08
小鳄鱼a 发表于 2016-10-24 16:52
我找到我的问题症结所在了 , 请看看附件 ,  谢谢。也就是b为什么不能显示宏变量 dti的取值
data aaa1;
format b yymmdd10.;
set aaa;
b=input("&dti.",yymmdd10.);
c=put(b,yymmdd10.);
run;
已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
小鳄鱼a + 5 + 5 + 5 + 5 精彩帖子

总评分: 论坛币 + 5  学术水平 + 5  热心指数 + 5  信用等级 + 5   查看全部评分

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-9 07:56