0

我创建了如下格式

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;

在此处输入图像描述

4

3 回答 3

2

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

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

于 2015-09-24T07:11:09.397 回答
1

使用格式时出了什么问题

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

proc contents data=output;
run;

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

使用格式时如何解决这个问题

解决它的一种方法是在为 赋值时已经应用格式zone,写入zone = put(region, $test);

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

为什么这种格式会这样

cntlin当您使用, in创建字符格式时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;
于 2015-09-24T07:21:37.513 回答
1

问题是您在为变量分配格式之前没有定义变量 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.);
于 2015-09-24T11:10:48.677 回答