宏增量

时间:2017-11-16 18:48:53

标签: macros sas

我的表查找值如下所示

sno date
1   200101 
2   200102
3   200103
4   200104

我在下面写了宏

%let date=200102
 proc sql;
 select sno into :no from lookup where date=&date.;
 quit;

我需要一个关于如何通过创建第一个s.no和date作为两个宏变量然后递增来将整个表查找转换为宏增量的帮助。因此,我不需要每次都在表查找中更新日期。因此,如果我查找日期201304,我需要获得相应的s.no

3 个答案:

答案 0 :(得分:1)

SNO值是否有模式?您是否基本上编号自01JAN2001以来的月份?如果是,请使用ggplot(df %>% gather(key, value, -date) %>% mutate(key=recode(key, "psavert"="Personal Saving Rate", "uempmed"="Unemployment Rate")), aes(x=date, y=value, fill=key)) + geom_area() + labs(title="Area Chart of Returns Percentage", subtitle="From Wide Data format", caption="Source: Economics", y="Returns %", fill="") + scale_x_date(date_breaks="1 year", date_labels="%Y") + scale_fill_manual(name="", values = c("#00ba38", "#f8766d")) + scale_y_continuous(breaks=seq(0,30,10), labels=paste0(seq(0,30,10),"%")) + annotate("text", x=as.Date("1975-04-01"), y=df %>% mutate(sum=psavert+uempmed) %>% pull(sum) %>% max + 1, label="Year with highest returns") 函数。

INTCK()

所以你可以创建两个宏变量。一个具有基准日期,另一个具有基本SNO值。

data test;
  input date yymmdd8. ;
  format date yymmdd10. ;
  sno = 1+intck('month','01JAN2001'd,date);
cards;
20010112
20010213
20010314
20010415
;

答案 1 :(得分:0)

动态构建查找表,并为表中的每一行创建一个宏变量。宏变量将命名为date_200101date_200102,......等等。它们将包含一个等于相应sno值的值:

data lookup;
  length var_name $20;
  do sno = 1 to intck('month','01jan2001'd,date())+1;
    date = input(put(intnx('month','01jan2001'd, sno-1, 'beginning'),yymmn6.),best.);
    var_name = cats('date_',date);
    call symput(var_name, cats(sno));
    output;
  end;
run;

然后你可以像这样引用宏变量:

%let date =200103;
%put &&date_&date;

...或...

%put &date_200101;

第一个用法示例是使用双宏分辨率。基本上,宏进程需要执行宏令牌&&date_&date的2次迭代才能完全解析它。在第一遍时,它会被解析为&date_200101。在第二次传递中,宏令牌&date_200101被解析为1

答案 2 :(得分:0)

如果您想简单地将一个(唯一)值转换为另一个值。您可以使用(in)格式。他们可以做的不仅仅是改变数据的读取/显示方式。它们易于使用,快速(内存中)并且一旦创建就不依赖于表格。如果工作(=>临时库)不适合您的需要,请将库更改为永久库。

options fmtsearch=(formats,work);

data fmt(keep = fmtname type start end label hlo default);
length fmtname $10 type $1 start end $6 label 8 hlo $1 default 8;
fmtname = 'date_to_no';
type = 'I';
label=0;
do y = 2001 to 2099;
    do m = 1 to 12;
        start = put(y,4.) || put(m,z2.);
        end = start;
        label + 1; 
        default=50; /*default length of the string compared when informat is used. Should be higher than both start and end*/
        output;
    end;
end;
/*if you want to assign a value (=label) to inputs not found. In this case it's -2*/
hlo="O";
start = "";
end = start;
label= -2;
output;
run;

proc format library=work cntlin=fmt;
run;

data test;
no = input('200101',date_to_no.); output;
no = input('201710',date_to_no.); output;
no = input('201713',date_to_no.); output;
run;