楼主: wazg
1716 6

[问答] 求助,如何实现滞后 [推广有奖]

  • 3关注
  • 0粉丝

已卖:384份资源

博士生

46%

还不是VIP/贵宾

-

威望
0
论坛币
270 个
通用积分
0.0631
学术水平
1 点
热心指数
5 点
信用等级
1 点
经验
8157 点
帖子
201
精华
0
在线时间
359 小时
注册时间
2005-8-23
最后登录
2019-12-10

楼主
wazg 发表于 2013-11-6 15:13:44 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
想通过宏变量来实现渐进滞后,形式如下


  1. data a;
  2. input x @@;
  3. cards;
  4. 1 2 3 4
  5. ;
  6. run;

  7. data test;
  8.   set a;
  9.   array b{3};
  10.   %let ii=0;
  11.   do i=1 to 3;  
  12.     %let ii=%eval(&ii.+1);
  13.     b{i}=lag&ii.(x);
  14.   end;
  15. run;
复制代码


上述程序实现不了,求助大家问题出在哪儿


二维码

扫码加我 拉你入群

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

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

关键词:如何实现 Input array cards Data 如何

捕获.JPG (13.28 KB)

捕获.JPG

沙发
Eternal0601 发表于 2013-11-6 18:56:08
%macro a;
data test2;
  set a;
  array b{3};
  %do i=1 %to 3;  
    b{&i}=lag&i.(x);
  %end;
run;
%mend;

%a

藤椅
wazg 发表于 2013-11-6 20:09:30
Eternal0601 发表于 2013-11-6 18:56
%macro a;
data test2;
  set a;
感谢您的程序!

另外,您能告诉我我的程序错在那里吗?

板凳
Eternal0601 发表于 2013-11-6 20:46:09
wazg 发表于 2013-11-6 20:09
感谢您的程序!

另外,您能告诉我我的程序错在那里吗?
你程序中的  %let ii=0;     %let ii=%eval(&ii.+1);是宏语句,会优先执行,并且只有一次,故每次你实际调用&ii.的值都为1, 但很奇怪的是b2,b3的值不是.,1,2,3,而是1,2,3,4,静等高手解释。
已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
webgu + 40 + 40 + 1 + 2 + 1 热心帮助其他会员

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

报纸
Eternal0601 发表于 2013-11-6 20:58:48
Eternal0601 发表于 2013-11-6 20:46
你程序中的  %let ii=0;     %let ii=%eval(&ii.+1);是宏语句,会优先执行,并且只有一次,故每次你实际调用 ...
楼主你的程序基本就是test2这段,很奇怪的是,下面两段程序结果是不同的,哈哈
data test1;
  set a;
  b1=lag(x);
  b2=lag(x);
  b3=lag(x);
run;

data test2;
  set a;
  array b{3};
  do i=1 to 3;
          b(i)=lag(x);
  end;
run;

地板
wazg 发表于 2013-11-6 21:02:51
Eternal0601 发表于 2013-11-6 20:46
你程序中的  %let ii=0;     %let ii=%eval(&ii.+1);是宏语句,会优先执行,并且只有一次,故每次你实际调用 ...
是不是说,%let ii=%eval(&ii.+1) 定义的ii=1仅在每一次循环内有效,下一次循环前又回到了外部%let ii=0

7
Eternal0601 发表于 2013-11-6 21:15:17
wazg 发表于 2013-11-6 21:02
是不是说,%let ii=%eval(&ii.+1) 定义的ii=1仅在每一次循环内有效,下一次循环前又回到了外部%let ii=0[ ...
不是,宏语句的执行跟一般的SAS语句执行顺序不同,这里%let ii=0; %let ii=%eval(&ii.+1);都只执行一次,不存在循环一说,尽管set的记录会读并执行四次。

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

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