使用SAS数据集创建的格式

时间:2015-09-24 07:03:02

标签: sas proc-format

我创建了以下格式

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;

enter image description here

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

使用格式时出现问题

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

proc contents data=output;
run;

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

使用格式

时如何解决此问题

解决问题的一种方法是在为zone指定值时编写zone = put(region, $test);时已应用格式。

另一种方法是在给出格式之前明确指定带有length zone $7;的区域的存储长度,或者像{1}}一样同时执行两者的存储长度。

为什么这种格式表现那样

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

proc format

这确实不合逻辑,更糟糕的是:您无法通过在proc format library = work.formats cntlin = work.formatset; run; 数据集中指定长度来更改它。

如何以格式本身来治愈

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

cntlin

答案 2 :(得分: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.);