我的表查找值如下所示
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
答案 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_200101
,date_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;