我正在尝试使用用户定义的格式为观察定义新值。但是,我的if / then / else语句似乎只适用于年份值为“2014”的观察。 put语句不适用于其他值。在SAS中,put语句在第一个语句中为蓝色,在另外两个语句中为黑色。这是我的意思的图片:
有谁知道我在这里缺少什么?这是我的完整代码:
data claims_t03_group;
set output.claims_t02_group;
if year = "2014" then test = put(compress(lookup,"_"),$G_14_PROD35.);
else if year = "2015" then test = put(compress(lookup,"_"),$G_15_PROD35.);
else test = put(compress(lookup,"_"),$G_16_PROD35.);
run;
以下是我所说的过程似乎在2014年“有效”的例子:
如您所见,当Year值为2014时,格式查找工作正常,测试字段返回我期望的值。但是,对于2015年和2016年,测试字段将返回查找值,而不进行任何格式设置。
答案 0 :(得分:0)
您的代码使用用户定义的格式$G_14_PROD.
- $G_16_PROD.
。我的猜测是,其中一个或多个存在问题,但除非您能提供格式定义,否则很难为您提供进一步的帮助。
尝试运行以下内容并共享生成的输出数据集work.prdfmts
:
proc sql noprint;
select cats(libname,'.',memname) into :myfmtlib
from sashelp.vcatalg
where objname = 'G_14_PROD';
quit;
proc format cntlout = prdfmts library=&myfmtlib;
select G_14_PROD G_15_PROD G_16_PROD;
run;
N.B。这假设您只有一个包含具有该名称的格式的目录,并且所有3种格式的格式定义都包含在同一目录中。如果没有,您将需要对其进行一些调整,并为每种格式运行一次以查找并导出定义。
答案 1 :(得分:0)
并非它可以解决您的实际问题,但您可以通过使用IF/THEN
功能取消PUTC()
。
data have ;
do year=2014,2015,2016;
do lookup='00_01','00_02' ;
output;
end;
end;
run;
proc format ;
value $G_14_PROD '0001'='2014 - 1' '0002'='2014 - 2' ;
value $G_15_PROD '0001'='2015 - 1' '0002'='2015 - 2' ;
value $G_16_PROD '0001'='2016 - 1' '0002'='2016 - 2' ;
run;
data want ;
set have ;
length test $35 ;
if 2014 <= year <= 2016 then
test = putc(compress(lookup,'_'),cats('$G_',year-2000,'_PROD.'))
;
run;
结果
Obs year lookup test
1 2014 00_01 2014 - 1
2 2014 00_02 2014 - 2
3 2015 00_01 2015 - 1
4 2015 00_02 2015 - 2
5 2016 00_01 2016 - 1
6 2016 00_02 2016 - 2