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

Sas 使用具有用户定义格式的put函数有条件地定义新字段,sas,Sas,我试图用用户定义的格式为观察定义一个新值。然而,我的if/then/else语句似乎只适用于年值为“2014”的观测值。put语句不适用于其他值。在SAS中,put语句在第一条语句中为蓝色,在其他两条语句中为黑色。以下是我的意思: 有人知道我在这里遗漏了什么吗?这是我的完整代码: data claims_t03_group; set output.claims_t02_group; if year = "2014" then test = put(compr

我试图用用户定义的格式为观察定义一个新值。然而,我的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年流程似乎“有效”的一个例子:


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

您的代码使用用户定义的格式,
$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;

注意:假设您只有一个目录包含具有该名称的格式,并且所有3种格式的格式定义都包含在同一目录中。如果没有,您需要对其进行一些调整,并对每种格式运行一次,以查找和导出定义。

这并不是说它解决了您的实际问题,而是您可以通过使用
PUTC()
函数来消除
If/THEN

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;

put
如果在上面的代码中,就不应该是蓝色的-反正它不在我的代码中。你能确认它仍然是蓝色的吗?如果是这样,那么您没有正确地转录代码,或者您的代码前面有一些其他问题(尝试只执行此数据步骤并放入一个新窗口)。只是为了澄清一下,如果是
语句
,则为蓝色;如果是
函数
,则为黑色
put
是两件事,所以这取决于语法解析器;如果它是蓝色的,那么它认为你在使用
语句,这意味着它可能看不到
测试=
部分。最后,你需要解释“工作”的含义。您在2014年获得了价值,但在其他两年中没有?或者你从2014年的格式中得到三年的值?在这里用合成的数据做一些例子会很有帮助-合成一些格式(你可以使用值语句)和一些示例行,然后编辑成问题。你的反馈真的很有用。请让我知道我是否可以更清楚地说明这一点。这三种格式的起始值是否相同,如上面的示例所示?还是第一个更像0001/0002/0003,第二个更像0004/0005/0006,第三个更像0007/0008/0009?我想说的是,现在有两种可能性:要么是它进入右侧IF/ELSE,但该格式被破坏/不存在;要么是它在错误的IF/ELSE上,并且该值在该格式上没有映射。如果所有格式都具有相同的起始值子集,则不可能使用第二种格式。
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