SAS:使用用户定义的格式时,如果不匹配,"default value" 是未格式化的输入变量吗?

SAS: When using user defined formats, if there's not a match, "default value" is the unformatted input variable?

在 SAS EG 中,我有一个用户定义的格式

value $MDC
'001' = '77'
'002' = '77 
...
'762' = '14' 
etc.

我的数据集有 DRG_code 个字符串变量,其值类似于“001”和“140”。

我试图用下面的代码创建一个新变量。

MDC = put(DRG_code, $MDC.)

只有我的数据集中变量DRG_code的值比较多,然后在用户定义的格式文件中指定,$MDC.

例如,当数据集 DRG_Code 等于 '140' 时,此值在用户定义格式中不存在,并且由于某种原因,put 语句是 returning MDC = '14 '(这应该只是它的值与 DRUG 代码是 '762')。

有没有办法确保我的 put 语句只有 return存在相应值时来自用户定义格式的值?

感谢您的反馈。

萝莉

我试过使用像 "length" 这样的格式来让我的 put 语句 return 3,我认为这会导致“140”而不是“14”,但没有用。

value $MDC
'001' = '77'
'002' = '77 
...
'762' = '14' 

MDC = put(DRG_code, $MDC.)

我假设所有值映射都是 $2,因为这是用于 'unfound' 源值的。为了确保 'unfound' 个值的长度,请确保 一个 格式化值的尾随空格填充到最长未找到值的长度。

value $MDC
'001' = '77     ' /* 7 characters, presuming no DRG_code exceeds 7 characters */
'002' = '77'
'762  = '14'

您也可以通过在应用格式时指定要使用的长度来解决此问题,例如

proc format;
  value $MDC
  '001' = '77'
  '762' = '14'
  ;
run;

data _null_;
  do var = '001','140','762';
    var_formatted = quote(put(var,$MDC3.));
    put var= var_formatted=;
  end;
run;

输出:

var=001 var_formatted="77 "
var=140 var_formatted="140"
var=762 var_formatted="14 "

N.B。这个解决方案和 Richard 的解决方案都会导致尾随空格被添加到格式化值中,正如您从引号中看到的那样。

这里我建议对user667489的解决方案稍作修改,以便:

  • 不需要每次使用都指定格式的长度(定义格式时使用value语句的default选项)
  • 生成的格式化值没有尾随空格(在应用格式产生的输出上使用 trim() 函数)

proc format;
    value $MDC(default=3)
        '001' = '77'
        '002' = '77'
        '762' = '14'
    ;
run;

data _null_;
    do var = '001', '140', '762';
        var_formatted = quote(trim(put(var, $MDC.)));
        put var= var_formatted=;
    end;
run;

给出以下输出:

var=001 var_formatted="77"
var=140 var_formatted="140"
var=762 var_formatted="14"

格式具有默认宽度。如果您在使用格式时未指定宽度,则 SAS 将使用默认宽度。制作用户定义格式时,PROC FORMAT 会将默认宽度设置为格式化值的最大宽度。在您的示例中,默认宽度设置为 2。

您可以在使用格式时覆盖它。

MDC = put(DRG_code, $MDC3.)

或者您可以在定义格式时定义默认值。

value $MDC (default=3)
  '001' = '77'
  '002' = '77'
  ...
  '762' = '14' 
;

您还可以使用 other 关键字为不匹配的值设置默认值。

value $MDC (default=3)
  '001' = '77'
  '002' = '77'
  ...
  '762' = '14' 
  other = 'UNK'
;

您甚至可以为不匹配的值(或任何目标格式)嵌套对另一种格式的调用。在这种情况下,您不需要指定默认宽度,因为在定义默认宽度时将使用嵌套格式的宽度。

value $MDC 
  '001' = '77'
  '002' = '77'
  ...
  '762' = '14' 
  other = [.]
;