楼主: peterpan_aus
2674 16

如何在data step生成macro 变量然后直接在step里用 [推广有奖]

  • 5关注
  • 0粉丝

讲师

60%

还不是VIP/贵宾

-

威望
0
论坛币
542 个
通用积分
6.4602
学术水平
0 点
热心指数
2 点
信用等级
0 点
经验
6198 点
帖子
214
精华
0
在线时间
855 小时
注册时间
2007-12-18
最后登录
2023-7-4

100论坛币
各位大大,小弟遇见一个问题,如题。希望在data 里生成一个变量然后直接在data step里用看下面程序,希望把j做成一个macro变量。这样就可以写成 var&j.=pay_date了。谢谢!


data g;

input indexs 1. pay_dt date9.  due_dt date9.;
format pay_dt date9.  due_dt date9.;
datalines;
1 12Dec14 11Dec14
2 14Jan15 11Jan15
3 17Mar15 11Feb15
4 17Apr15 11Mar15
5 13May15 11Apr15
6          11May15
7          11Jun15
8          11Jul15
9          11Aug15
;
run;

proc sql noprint;
   select max(indexs) into :max_index
from g;
quit;


%macro varlist(n);
%do i=1 %to &n;
format var&i. date9.;
   retain var&i.;
%end;
%mend;

%macro t;
data test;
  set g;
retain j;
  %varlist(&max_index);
      if not missing(pay_dt) then do;
        days_diff=intck('days',due_dt,pay_dt);
        if days_diff>3 then do;
          j+1;
          if j=1 then var1=pay_dt;
          if j=2 then var2=pay_dt;
          if j=3 then var3=pay_dt;
          if j=4 then var4=pay_dt;
          if j=5 then var5=pay_dt;
          if j=6 then var6=pay_dt;
          if j=7 then var7=pay_dt;
          if j=8 then var8=pay_dt;
          if j=9 then var9=pay_dt;
        end;
    end;
run;
                     
%mend;

%t;

最佳答案

mingfeng07 查看完整内容

给你举个简单例子:我这个代码中var&i.可以被赋值,所以你可以检查一下是否是你的代码其它地方出什么问题了。
关键词:Data step Macro Step Data CRO 如何
沙发
mingfeng07 学生认证  发表于 2015-9-24 13:21:50 |只看作者 |坛友微信交流群
peterpan_aus 发表于 2015-9-24 15:37
%macro fffff;
data test1;
  set g;
给你举个简单例子:
  1. %macro test;
  2. data a;
  3. a=5;
  4. %do i=1 %to 9;
  5. if a=&i. then var&i.=a+1;
  6. %end;
  7. run;
  8. %mend;
  9. %test;
复制代码
我这个代码中var&i.可以被赋值,所以你可以检查一下是否是你的代码其它地方出什么问题了。

使用道具

藤椅
cranewind 发表于 2015-9-24 13:55:30 |只看作者 |坛友微信交流群
没看明白

使用道具

板凳
peterpan_aus 发表于 2015-9-24 14:20:18 |只看作者 |坛友微信交流群
cranewind 发表于 2015-9-24 13:55
没看明白
就是怎么把J变成一个macro,然后直接可以var&j.这样用。不好意思我表达能力有点差

使用道具

直接加个 do j=1 to 9不可以吗?

使用道具

地板
peterpan_aus 发表于 2015-9-24 15:04:53 |只看作者 |坛友微信交流群
统计2008陈利 发表于 2015-9-24 14:31
直接加个 do j=1 to 9不可以吗?
我需要 var&j.呀

使用道具

7
mingfeng07 学生认证  发表于 2015-9-24 15:18:26 |只看作者 |坛友微信交流群
  1. /* if days_diff>3 then do;*/
  2. /*           j+1;*/
  3.         %do i=1 %to 9;
  4.          if j=&i. then var&i.=a;
  5.         %end;
  6. /***********/
复制代码

使用道具

8
ippique004 发表于 2015-9-24 15:18:42 |只看作者 |坛友微信交流群
你的意思是,用var&j.来直接做if的判断么?还是在outter macro里面直接套用&j?

使用道具

9
peterpan_aus 发表于 2015-9-24 15:35:30 |只看作者 |坛友微信交流群
ippique004 发表于 2015-9-24 15:18
你的意思是,用var&j.来直接做if的判断么?还是在outter macro里面直接套用&j?
用var&j.来直接做if的判断

使用道具

10
peterpan_aus 发表于 2015-9-24 15:37:01 |只看作者 |坛友微信交流群
mingfeng07 发表于 2015-9-24 15:18
%macro fffff;
data test1;
  set g;
  by lid;
  retain j ;
  %varlist(&max_index);
          if not missing(pay_dt) then do;
            days_diff=intck('days',due_dt,pay_dt);
                if days_diff>3 then do;
               
                  j+1;
                          %do i=1 %to 9;
                         if j=%eval(&i.) then do;
                          a=1;
                          var&i.=pay_date;
                  end;
                                %end;
               
                end;

       
        end;




          

run;
                             
%mend;

%fffff;

用了这个方法但是pay_date 的值不了给var&j. 但是确实可以判断因为a=1的值进去了。

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-25 02:36