【问题标题】:Usage of Created Formats from SAS Data Sets使用 SAS 数据集中创建的格式
【发布时间】:2015-09-24 19:10:48
【问题描述】:

我创建了如下格式

data formatset;
    input fmtname $ start $ end $ label $;
    datalines;
$test region1 region3 zone1
$test region4 region5 zone2
$test region6 region7 zone3
;
run;

proc format library = work.formats
    cntlin = work.formatset;
run;
quit;

问题:我将获得带有变量region 的新数据线数据。我想要一个新属性zone,它使用$test.格式

data output;
    input region $;
    format zone $test.;
    zone = region;
    datalines;
region1
region2
region3
region4
region5
region6
region7
region8
;
run;

【问题讨论】:

    标签: sas proc-format


    【解决方案1】:

    您需要在使用格式时指定宽度,以确保从您的zone 变量中读取足够的字符。在第二个数据步骤中尝试 format zone $test7.;

    如果不指定宽度,SAS 默认为为格式定义的任何显示值的最大长度。然后,在查找要显示的格式化值时,它将仅从格式化变量中读取那么多字符(在您的情况下为 5),如果在格式中没有为这 5 个字符指定值,则它们将逐字显示。

    【讨论】:

      【解决方案2】:

      使用格式时出了什么问题

      使用format zone $test.;,您创建了一个内部长度为$5(五个字符)的变量zone。为了证明这一点,运行

      proc contents data=output;
      run;
      

      使用zone = region;,您将region 的值分配给zone,然后将其截断为5 个字符。该标签仅在您打印或列出数据时应用。在那个时间点,变量zone 包含文本“regio”,它不在startend 范围之一,因此不会被翻译。

      使用格式时如何解决此问题

      解决此问题的一种方法是在您为zone 赋值时应用该格式,写作zone = put(region, $test);

      另一种方法是在指定格式之前使用length zone $7; 明确指定区域的存储长度,或者像其他答案所建议的那样使用format zone $test.; 同时执行这两项操作。

      为什么这种格式会这样

      当您使用cntlin 创建字符格式时,在proc format 中,它接收的长度为最大标签长度,在您的情况下为5 个字符。此长度是存储具有该格式的变量的字符数。 你可以看到,如果你运行

      proc format library = work.formats
          cntlin = work.formatset;
      run;
      

      这确实不合逻辑,更糟糕的是:您无法通过在 cntlin 数据集中指定长度来更改它。

      如何在格式本身中解决它

      只需指定格式应显示 8 字节长的任何值:

      data formatset;
          input fmtname $ start $ end $ label $;
          datalines;
      $test region1 region3 zone1
      $test region4 region5 zone2
      $test region6 region7 zone3
      $test _dummy_ _dummy_ 1234567
      ;
      run;
      

      【讨论】:

        【解决方案3】:

        问题是您在为变量 ZONE 分配格式之前没有定义它。所以SAS使用分配格式的默认长度来定义可变区。您可以通过将 FORMAT 语句移到赋值语句之后来解决此问题。然后 SAS 会假设 ZONE 应该与 REGION 具有相同的长度。

        但真正的解决方案是在使用变量或将格式附加到它们之前定义变量。

        data output;
          length region $8 zone $8 ;
          input region;
          zone = region;
          format zone $test.;
        cards ;
        ...
        

        如果您希望 ZONE 的值是 $TEST 的值。格式将显示然后在赋值语句中使用 PUT() 函数,而不是将格式附加到变量。

        zone = put(region,$test.);
        

        【讨论】:

          猜你喜欢
          • 2013-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-06
          • 1970-01-01
          • 1970-01-01
          • 2020-10-03
          • 1970-01-01
          相关资源
          最近更新 更多