SAS:使用用户定义格式时,如果不匹配,“默认值”是未格式化的输入变量吗?

Posted

技术标签:

【中文标题】SAS:使用用户定义格式时,如果不匹配,“默认值”是未格式化的输入变量吗?【英文标题】:SAS: When using user defined formats, if there's not a match, "default value" is the unformatted input variable? 【发布时间】:2019-06-24 01:34:02 【问题描述】:

在 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 语句返回 MDC = '14' (这应该只是它的值与 DRUG代码是'762')。

有没有办法确保我的 put 语句仅在存在相应值时返回用户定义格式的值?

感谢反馈。

萝莉

我尝试使用“长度”之类的格式让我的 put 语句返回 3,我认为这会导致“140”而不是“14”,但没有奏效。

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

MDC = put(DRG_code, $MDC.)

【问题讨论】:

您想要原始值不在列表中吗?或者您是否希望将这些值转换为一些常量文本? 您可能想考虑以某种方式明确地捕获那些,但 Tom 的解决方案中说明的 OTHER 选项正是您所需要的。 【参考方案1】:

格式具有默认宽度。如果您在使用格式时未指定宽度,则 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 = [$3.]
;

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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 "

注意从引号中可以看出,此解决方案和 Richard 的解决方案都会导致尾随空格被添加到格式化值中。

【讨论】:

【参考方案4】:

在这里我建议对 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:使用用户定义格式时,如果不匹配,“默认值”是未格式化的输入变量吗?的主要内容,如果未能解决你的问题,请参考以下文章

如果不匹配,则访问查询默认值

如何填充具有默认值的用户定义记录?

数据绑定

SQL怎么取当前时间是YYYYMMDDHHMMSS格式的?

SASS 中变量的默认值

Azure 文件共享 SAS 令牌签名未按预期生成,如何为文件对象生成签名以匹配门户中生成的签名?