使用具有用户定义格式的put函数有条件地定义新字段

时间:2016-11-17 16:35:37

标签: sas

我正在尝试使用用户定义的格式为观察定义新值。但是,我的if / then / else语句似乎只适用于年份值为“2014”的观察。 put语句不适用于其他值。在SAS中,put语句在第一个语句中为蓝色,在另外两个语句中为黑色。这是我的意思的图片:

enter image description here

有谁知道我在这里缺少什么?这是我的完整代码:

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年“有效”的例子:

enter image description here

如您所见,当Year值为2014时,格式查找工作正常,测试字段返回我期望的值。但是,对于2015年和2016年,测试字段将返回查找值,而不进行任何格式设置。

2 个答案:

答案 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