【问题标题】:SAS: When using user defined formats, if there's not a match, "default value" is the unformatted input variable?SAS:使用用户定义格式时,如果不匹配,“默认值”是未格式化的输入变量吗?
【发布时间】: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 选项正是您所需要的。

标签: sas format user-defined


【解决方案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"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-08
          • 2012-04-03
          • 2015-06-07
          • 2014-02-23
          • 2020-06-05
          • 1970-01-01
          • 2022-01-26
          相关资源
          最近更新 更多